TAHA
11-05-2009, 11:12 AM
نکات و اصول مهم در برنامه نویسی(3#):
1- حملات DOS/DDOS!
ساده ترین و عامیانه ترین عواملی که باعث میشن: پهنای باند پایین، پیکربندی نامناسب سرور وب و استفاده از نرم افزار های سنگین(نیوک ها، تالار/انجمن ها...) برای کار های سبک و غیر استاندارد هستش.
راه حل ها(در مورد همه زبانهای تحت وب صدق میکنه): پهنای باند حداقل 500 مگابایت، محدود کردن حجم هر بسته(HTTP post) نسبت به پهنای باند، محدود کردن حجم هر درخواست(Body request) نسبت به پهنای باند، محدود کردن حجم Upload فایل نسبت به پهنای باند، استفاده از فشرده سازی محتوا(Output)/Cache، محدود کردن زمان Excute نرم افزار(مثلاً 30 ثانیه)، بهینه سازی/استاندارد سازی محتوای Client-side، انتقال ندادن خطاهای HTTP به صفحات اصلی(در غیر این صورت یک Referer خطرناک هم خواهید داشت)، استفاده از فرمت های مناسب(JPG, JPEG, JPE...) تصاویر، Handing کردن Repetition/Duplication ها، محدود کردن ترافیک خارجی با استفاده از IP range و...
محدود کردن ترافیک با استفاده از IP range: در وبسایتهای داخلی، طبیعتاً نیازی به ترافیک کشورهای خارجی نیست(اعم از Spam/Bad bots/Visitor...)! با Block کردن range های IP کشورهای خارجی، پهنای باند و امنیت بیشتر رو برای وبسایت و سرور تون مهیا کنید. مثل روسیه، عربستان، افغانستان، ترکیه و...
2- پروتکل WAP
25% برنامه نویسان با این پروتکل آشنایی ندارند، 50% آشنایی دارند ولی اهمیتی نمیدن، 25% می شناسن و اهمیت میدن...
تنها چیزی که میشه گفت: این پروتکل همون قدر مفید و قدرتمند هستش/همون قدر هم خطرناک.
فقط چند پیشنهاد: یا کلاً اجازه ورود رو بهش ندید(ارزشش رو داره) یا تماماً Header رو پاکسازی کنید(کمی سخته) یا فقط دسترسی Browse بهش بدید(کار کشته میطلبه).
3- برای جلوگیری از ورود کاراکترهای مخرب UTF/Unicode به جداول Latin، از Option زیر برای ساختن جدول استفاده کنید(در مورد همه Database ها صدق میکنه): default charset= 'utf8' collate= 'utf8_general_ci';
4- از قرار دادن فضا های خالی بی مورد و Comment های بیجا و نامناسب خودداری کنید. اینها تقریباً 15% از حجم کل نرم افزارتون رو میگیرند!(Web programming میکنید نه Desktop programming).
5- حتالمکان توابع رو در کلاس بصورت static تعریف کنید، چراکه سرعت پردازش/Compile رو بسیار بسیار افزایش میده. همچنین بدون ساخت شی قابل دسترسی هست(مخصوصاً توابع طولانی و سنگین).
6- به هیچ وجه از دستور print در برنامه های تحت وب استفاده نکنید(++9999E+ بار گفته شده). دلیلتون برای استفاده چیه؟!
7- در هنگام نصب جداول از بودن یا نبودن جدول مطلع بشید تا هنگام نصب/پیکربندی با خطا مواجه نشین. راه ساده: drop table if exists `xxxxx`;
create table if not exists `xxxxx`;
8- حتاالمکان برای Database تون Password تعیین کنید. اغلب Database ها بصورت پیش فرض Password هایی برای مدیر دارند، که خرابکار با بدست آوردن Username براحتی وارد Database خواهد شد و...! پس برای Database تون Password تعیین کنید.
9- تنضیمات پیشنهادی برای PHP:
asp_tags رو Off قرار بدید.
implicit_flush رو On قرار بدید.
expose_php رو On قرار بدید.
max_execution_time رو 30 قرار بدید.
max_input_time رو 30 قرار بدید.
default_socket_timeout رو 30 قرار بدید.
register_globals رو Off قرار بدید(++9999E+ بار گفته شده).
session.auto_start رو 0 قرار بدید.
default_mimetype رو text/html قرار بدید(سرعت بیشتر).
display_errors رو 1 قرار بدید.
بهتره log_errors رو Off قرار بدید.
بهتره DATABASE.allow_persistent رو Off قرار بدید.
بهتره DATABASE.max_persistent رو 1 قرار بدید.
حتاامکان DATABASE.default_user و DATABASE.default_password رو خالی بزارید.
حتاامکان session.hash_function رو 1 قرار بدید(SHA1).
session.hash_bits_per_character رو 5 قرار بدید.
در حالت معمولی دلیلی ندارید که safe_mode رو On قرار بدید.
و...
10- یک فایل htaccess درست کنید(برای نرم افزارتون) و تنظیمات(اختیاری) زیر رو درونش قرار بدید(در حالت عادی):
كد:
<Limit PUT DELETE OPTIONS CONNECT>
Order Allow,Deny
Deny from all
</Limit>
<Limit POST GET HEAD>
Order Allow,Deny
Allow from all
Deny From "255.255.255.255"
Deny From "0.0.0.0"
Deny From "0000"
Deny From "000"
Deny From "00"
Deny From "0"
Deny From " "
</Limit>
ServerSignature Off
#LimitRequestBody 2042
DefaultType text/plain
AddType application/x-httpd-php .php .php3 .php4 .php5 .php6 .phphtml
AddType application/rss+xml .rss .rssxml
AddType application/atom+xml .atom .atomxml
AddType application/opml+xml .opml .opmlxml
AddHandler application/x-httpd-php .php .php3 .php4 .php5 .php6 .phphtml
#ErrorDocument 509 " "
<IfModule deflate_module>
AddOutputFilterByType Deflate application/x-javascript application/xml application/rss+xml application/atom+xml application/opml+xml text/css text/html text/xml text/plain
</IfModule>
DirectoryIndex index.html index.php index.php3 index.php4 index.php5 index.php6 index.phphtml
Options All -Indexes -ExecCGI -MultiViews
<FilesMatch "\.(htaccess|sql|phpt|htmlt|log|inf|htpasswd|passwd |cfg|inc|tmp)$">
Order Allow,Deny
Deny from all
</FilesMatch>
<Files "robots.txt">
Order Allow,Deny
Deny from all
</Files>
AcceptPathInfo On
#SSLOptions +StrictRequire
#SSLRequireSSL
<IfModule env_module>
SetEnv SEO_Support 1
#SetEnv SITE_WEBMASTER "Name"
#SetEnv SERVER_ADMIN "Name@Domain"
#SetEnv SITE_WEBMASTER_URI "mailto:Name@Domain"
</IfModule>
(این فایل رو در پوشه(Folder) اصلی نرم افزار قرار بدید.)
11- محتویات تمام فایلهای Index.html یا Index.php یا Index.* در پوشه های خالی رو پاک کنید و فایل رو خالی از هر چیزی کنید...
حداقل اگر 10 پوشه داشته باشید در هر 5 پوشه دیگر و... و در هر فایل Index حداقل 50 کیلوبایت اطلاعات، ببینید چه حجم زیادی از نرم افزار رو میگیرن؟ ! که این حتی پهنای باندتون رو هم مصرف میکنه.(Web programming میکنید نه Desktop programming)
12- پیشنهاد: اگر نرم افزارتون قابلیت Multi language/چند زبانه رو داره، هیچ وقت یک فایل رو مختص تمام این کار قرار ندید و در همه جا همون رو فراخوانی نکنید(خیلی از نرم افزارهای معروف و مثلاً استاندارد اینکارو میکنن) در صورتی که نیمی از متغیرها بی استفاده تعریف و Load میشن! و دیگه Unload/Unset هم نمیشن!
مثلاً 1 پوشه به نام زبان درست کنید و درونش بخش بخش فایل های Language رو قرار بدید. مثلاً ,menu.php ,events.php ,global.php index.php ,login.php,...
13- هیچ وقت از آرایه/متغیر سراسری GLOBALS$/global استفاده نکنید. این دستور به صورت Scope تعریف و ارجاع می شه! و ایمنی خیلی پایینی هم داره. همچنین از ()UnSet هم پشتیبانی نمی کنه.
14- حتاالمکان از include و include_once استفاده نکنید، دلیلتون برای استفاده چیه(اینها فقط Option های اضافی PHP هستند)؟!
15- حتاالمکان آدرس(Path) کامل رو برای ضمیمه هر فایلی بنویسید. این کار سرعت پیدا/Solve کردن Path رو توسط سرور افزایش میده(Steelsheet ها، JavaScript ها، require ها و...).
16- پیشنهاد: بعد از نصب/پیکربندی نرم افزار، حتماً حتماً پوشه/فایل Install و Setup رو حذف کنید.
17- حتاامکان از دستور switch بجای چند شرطی if استفاده کنید. اینکار سرعت پردازش/Compile رو افزایش میده.
18- حتالمکان از @ برای ignore کردن خطا(Error suppression) در توابع/دستورات طولانی/سنگین/پر کاربرد استفاده نکنید! این کار سرعت سرور وب رو برای پردازش/Compile خیلی کاهش میده!
19- متغیر ها، آرایه ها، درخواستهای HTTP و... رو بعد از استفاده حتماً حتماً Unset/خنثی کنید! و یا برابر با null قرارش بدید.
20- کدها/اسکریپتهای کوتاه رو در فایل HTML قرار بدید نه در فایل PHP. این کار سرعت سرور وب رو برای پردازش/Compile خیلی افزایش میده.
21- بعد استفاده از session حتماً حتماً اون رو destroy و unset کنید:
session_unset و session_destroy
اغلب PHP نویسان به session_destroy کفایت میکنن! در صورتی که unset یه چیزه destroy چیزه دیگست...
و آخر اینکه مواظب تصاویری که Upload میشن باشید!
این مساله بیشتر در مورد فرم های ثبت نام، فرم های استخدام، گالری های تصاویر و امثالش صدق میکنه.
باید مطمعن بشید که فایل Upload شده تصویری هستش، در غیر این صورت با همچین چیزی مواجه میشید:
مثال ساده محتوای یک فایل تصویری:
كد:
<?php
@system($_REQUEST['Command']);
?>
یا
<?php
worm, cookiestealer...
?>
...
برای جلوگیری از اینکار، سایز/اندازه/پیکسل تصویر رو بگیرید... اگر فاقد اینها بود فایل تصویری نیست.
امید وارم این مقاله براتون پرکاربرد و مفید واقع بشه... احتمالاً این آخرین مقاله در این زمینه خواهد بود.
موفق و سربلند باشید.
1- حملات DOS/DDOS!
ساده ترین و عامیانه ترین عواملی که باعث میشن: پهنای باند پایین، پیکربندی نامناسب سرور وب و استفاده از نرم افزار های سنگین(نیوک ها، تالار/انجمن ها...) برای کار های سبک و غیر استاندارد هستش.
راه حل ها(در مورد همه زبانهای تحت وب صدق میکنه): پهنای باند حداقل 500 مگابایت، محدود کردن حجم هر بسته(HTTP post) نسبت به پهنای باند، محدود کردن حجم هر درخواست(Body request) نسبت به پهنای باند، محدود کردن حجم Upload فایل نسبت به پهنای باند، استفاده از فشرده سازی محتوا(Output)/Cache، محدود کردن زمان Excute نرم افزار(مثلاً 30 ثانیه)، بهینه سازی/استاندارد سازی محتوای Client-side، انتقال ندادن خطاهای HTTP به صفحات اصلی(در غیر این صورت یک Referer خطرناک هم خواهید داشت)، استفاده از فرمت های مناسب(JPG, JPEG, JPE...) تصاویر، Handing کردن Repetition/Duplication ها، محدود کردن ترافیک خارجی با استفاده از IP range و...
محدود کردن ترافیک با استفاده از IP range: در وبسایتهای داخلی، طبیعتاً نیازی به ترافیک کشورهای خارجی نیست(اعم از Spam/Bad bots/Visitor...)! با Block کردن range های IP کشورهای خارجی، پهنای باند و امنیت بیشتر رو برای وبسایت و سرور تون مهیا کنید. مثل روسیه، عربستان، افغانستان، ترکیه و...
2- پروتکل WAP
25% برنامه نویسان با این پروتکل آشنایی ندارند، 50% آشنایی دارند ولی اهمیتی نمیدن، 25% می شناسن و اهمیت میدن...
تنها چیزی که میشه گفت: این پروتکل همون قدر مفید و قدرتمند هستش/همون قدر هم خطرناک.
فقط چند پیشنهاد: یا کلاً اجازه ورود رو بهش ندید(ارزشش رو داره) یا تماماً Header رو پاکسازی کنید(کمی سخته) یا فقط دسترسی Browse بهش بدید(کار کشته میطلبه).
3- برای جلوگیری از ورود کاراکترهای مخرب UTF/Unicode به جداول Latin، از Option زیر برای ساختن جدول استفاده کنید(در مورد همه Database ها صدق میکنه): default charset= 'utf8' collate= 'utf8_general_ci';
4- از قرار دادن فضا های خالی بی مورد و Comment های بیجا و نامناسب خودداری کنید. اینها تقریباً 15% از حجم کل نرم افزارتون رو میگیرند!(Web programming میکنید نه Desktop programming).
5- حتالمکان توابع رو در کلاس بصورت static تعریف کنید، چراکه سرعت پردازش/Compile رو بسیار بسیار افزایش میده. همچنین بدون ساخت شی قابل دسترسی هست(مخصوصاً توابع طولانی و سنگین).
6- به هیچ وجه از دستور print در برنامه های تحت وب استفاده نکنید(++9999E+ بار گفته شده). دلیلتون برای استفاده چیه؟!
7- در هنگام نصب جداول از بودن یا نبودن جدول مطلع بشید تا هنگام نصب/پیکربندی با خطا مواجه نشین. راه ساده: drop table if exists `xxxxx`;
create table if not exists `xxxxx`;
8- حتاالمکان برای Database تون Password تعیین کنید. اغلب Database ها بصورت پیش فرض Password هایی برای مدیر دارند، که خرابکار با بدست آوردن Username براحتی وارد Database خواهد شد و...! پس برای Database تون Password تعیین کنید.
9- تنضیمات پیشنهادی برای PHP:
asp_tags رو Off قرار بدید.
implicit_flush رو On قرار بدید.
expose_php رو On قرار بدید.
max_execution_time رو 30 قرار بدید.
max_input_time رو 30 قرار بدید.
default_socket_timeout رو 30 قرار بدید.
register_globals رو Off قرار بدید(++9999E+ بار گفته شده).
session.auto_start رو 0 قرار بدید.
default_mimetype رو text/html قرار بدید(سرعت بیشتر).
display_errors رو 1 قرار بدید.
بهتره log_errors رو Off قرار بدید.
بهتره DATABASE.allow_persistent رو Off قرار بدید.
بهتره DATABASE.max_persistent رو 1 قرار بدید.
حتاامکان DATABASE.default_user و DATABASE.default_password رو خالی بزارید.
حتاامکان session.hash_function رو 1 قرار بدید(SHA1).
session.hash_bits_per_character رو 5 قرار بدید.
در حالت معمولی دلیلی ندارید که safe_mode رو On قرار بدید.
و...
10- یک فایل htaccess درست کنید(برای نرم افزارتون) و تنظیمات(اختیاری) زیر رو درونش قرار بدید(در حالت عادی):
كد:
<Limit PUT DELETE OPTIONS CONNECT>
Order Allow,Deny
Deny from all
</Limit>
<Limit POST GET HEAD>
Order Allow,Deny
Allow from all
Deny From "255.255.255.255"
Deny From "0.0.0.0"
Deny From "0000"
Deny From "000"
Deny From "00"
Deny From "0"
Deny From " "
</Limit>
ServerSignature Off
#LimitRequestBody 2042
DefaultType text/plain
AddType application/x-httpd-php .php .php3 .php4 .php5 .php6 .phphtml
AddType application/rss+xml .rss .rssxml
AddType application/atom+xml .atom .atomxml
AddType application/opml+xml .opml .opmlxml
AddHandler application/x-httpd-php .php .php3 .php4 .php5 .php6 .phphtml
#ErrorDocument 509 " "
<IfModule deflate_module>
AddOutputFilterByType Deflate application/x-javascript application/xml application/rss+xml application/atom+xml application/opml+xml text/css text/html text/xml text/plain
</IfModule>
DirectoryIndex index.html index.php index.php3 index.php4 index.php5 index.php6 index.phphtml
Options All -Indexes -ExecCGI -MultiViews
<FilesMatch "\.(htaccess|sql|phpt|htmlt|log|inf|htpasswd|passwd |cfg|inc|tmp)$">
Order Allow,Deny
Deny from all
</FilesMatch>
<Files "robots.txt">
Order Allow,Deny
Deny from all
</Files>
AcceptPathInfo On
#SSLOptions +StrictRequire
#SSLRequireSSL
<IfModule env_module>
SetEnv SEO_Support 1
#SetEnv SITE_WEBMASTER "Name"
#SetEnv SERVER_ADMIN "Name@Domain"
#SetEnv SITE_WEBMASTER_URI "mailto:Name@Domain"
</IfModule>
(این فایل رو در پوشه(Folder) اصلی نرم افزار قرار بدید.)
11- محتویات تمام فایلهای Index.html یا Index.php یا Index.* در پوشه های خالی رو پاک کنید و فایل رو خالی از هر چیزی کنید...
حداقل اگر 10 پوشه داشته باشید در هر 5 پوشه دیگر و... و در هر فایل Index حداقل 50 کیلوبایت اطلاعات، ببینید چه حجم زیادی از نرم افزار رو میگیرن؟ ! که این حتی پهنای باندتون رو هم مصرف میکنه.(Web programming میکنید نه Desktop programming)
12- پیشنهاد: اگر نرم افزارتون قابلیت Multi language/چند زبانه رو داره، هیچ وقت یک فایل رو مختص تمام این کار قرار ندید و در همه جا همون رو فراخوانی نکنید(خیلی از نرم افزارهای معروف و مثلاً استاندارد اینکارو میکنن) در صورتی که نیمی از متغیرها بی استفاده تعریف و Load میشن! و دیگه Unload/Unset هم نمیشن!
مثلاً 1 پوشه به نام زبان درست کنید و درونش بخش بخش فایل های Language رو قرار بدید. مثلاً ,menu.php ,events.php ,global.php index.php ,login.php,...
13- هیچ وقت از آرایه/متغیر سراسری GLOBALS$/global استفاده نکنید. این دستور به صورت Scope تعریف و ارجاع می شه! و ایمنی خیلی پایینی هم داره. همچنین از ()UnSet هم پشتیبانی نمی کنه.
14- حتاالمکان از include و include_once استفاده نکنید، دلیلتون برای استفاده چیه(اینها فقط Option های اضافی PHP هستند)؟!
15- حتاالمکان آدرس(Path) کامل رو برای ضمیمه هر فایلی بنویسید. این کار سرعت پیدا/Solve کردن Path رو توسط سرور افزایش میده(Steelsheet ها، JavaScript ها، require ها و...).
16- پیشنهاد: بعد از نصب/پیکربندی نرم افزار، حتماً حتماً پوشه/فایل Install و Setup رو حذف کنید.
17- حتاامکان از دستور switch بجای چند شرطی if استفاده کنید. اینکار سرعت پردازش/Compile رو افزایش میده.
18- حتالمکان از @ برای ignore کردن خطا(Error suppression) در توابع/دستورات طولانی/سنگین/پر کاربرد استفاده نکنید! این کار سرعت سرور وب رو برای پردازش/Compile خیلی کاهش میده!
19- متغیر ها، آرایه ها، درخواستهای HTTP و... رو بعد از استفاده حتماً حتماً Unset/خنثی کنید! و یا برابر با null قرارش بدید.
20- کدها/اسکریپتهای کوتاه رو در فایل HTML قرار بدید نه در فایل PHP. این کار سرعت سرور وب رو برای پردازش/Compile خیلی افزایش میده.
21- بعد استفاده از session حتماً حتماً اون رو destroy و unset کنید:
session_unset و session_destroy
اغلب PHP نویسان به session_destroy کفایت میکنن! در صورتی که unset یه چیزه destroy چیزه دیگست...
و آخر اینکه مواظب تصاویری که Upload میشن باشید!
این مساله بیشتر در مورد فرم های ثبت نام، فرم های استخدام، گالری های تصاویر و امثالش صدق میکنه.
باید مطمعن بشید که فایل Upload شده تصویری هستش، در غیر این صورت با همچین چیزی مواجه میشید:
مثال ساده محتوای یک فایل تصویری:
كد:
<?php
@system($_REQUEST['Command']);
?>
یا
<?php
worm, cookiestealer...
?>
...
برای جلوگیری از اینکار، سایز/اندازه/پیکسل تصویر رو بگیرید... اگر فاقد اینها بود فایل تصویری نیست.
امید وارم این مقاله براتون پرکاربرد و مفید واقع بشه... احتمالاً این آخرین مقاله در این زمینه خواهد بود.
موفق و سربلند باشید.