Y.P.Y
Well-Known Member
نکات و اصول مهم در برنامه نویسی(3#)
نکات و اصول مهم در برنامه نویسی(3#):
اگر این مقاله براتون مفید و موثر واقع شد، مقالات قبلیم در رابطه با همین موضوع رو می تونید در "نکات و اصول مهم در برنامه نویسی(1#)" و "نکات و اصول مهم در برنامه نویسی(2#)" دنبال کنید.
1- حملات DOS/DDOS
ساده ترین و عامیانه ترین عواملی که باعث میشن: پهنای باند پایین، پیکربندی نامناسب سرور وب و استفاده از نرم افزار های سنگین(نیوک ها، تالار/انجمن ها...) برای کارهای سبک و غیر استاندارد در فضاهای کوچیک هستش.
راه حل ها(در مورد همه زبانهای تحت وب صدق میکنه): پهنای باند حداقل 500 مگابایت، محدود کردن حجم هر بسته(HTTP post) نسبت به پهنای باند، محدود کردن حجم هر درخواست(Body request) نسبت به پهنای باند، محدود کردن حجم Upload فایل نسبت به پهنای باند، استفاده از فشرده سازی محتوا(Output)/Cache، محدود کردن زمان Excute نرم افزار(مثلاً 60 ثانیه)، بهینه سازی/استاندارد سازی محتوای 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 ها صدق میکنه): [LTR]default charset= 'utf8' collate= 'utf8_general_ci';[/LTR]
4- از قرار دادن فضا های خالی بی مورد و Comment های بیجا و نامناسب خودداری کنید. اینها تقریباً 10% از حجم کل نرم افزارتون رو اشغال می کنند(Web programming می کنید نه Desktop programming).
5- حتالمکان توابع رو در کلاس بصورت static تعریف کنید، چراکه سرعت پردازش/Compile رو بسیار بسیار افزایش میده. همچنین بدون ساخت شی قابل دسترسی هست(مخصوصاً توابع طولانی و سنگین).
6- به هیچ وجه از دستور print در برنامه های تحت وب استفاده نکنید(هزاران بار گفته شده). دلیلتون برای استفاده چیه؟!
7- در هنگام نصب جداول از بودن یا نبودن جدول مطلع بشید تا هنگام نصب/پیکربندی با خطا مواجه نشین. راه ساده: [LTR]drop table if exists `xxxxx`;
create table if not exists `xxxxx`;[/LTR]
8- برای Database تون Password تعیین کنید. اغلب Database ها بصورت پیش فرض Password هایی برای مدیر دارند، که خرابکار با بدست آوردن Username براحتی وارد Database خواهد شد و...
9- تنضیمات پیشنهادی برای PHP:
asp_tags رو Off قرار بدید.
implicit_flush رو On قرار بدید.
expose_php رو Off قرار بدید.
max_execution_time رو 30 قرار بدید.
max_input_time رو 30 قرار بدید.
default_socket_timeout رو 30 قرار بدید.
register_globals رو Off قرار بدید(هزاران بار گفته شده).
session.auto_start رو 0 قرار بدید.
default_mimetype رو text/html قرار بدید(سرعت بیشتر).
display_errors رو 1 قرار بدید.
بهتره log_errors رو On قرار بدید.
بهتره 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 قرار بدید.
mbstring.func_overload رو 0 قرار بدید(http://bugs.php.net/bug.php?id=30766).
توابع apache_child_terminate, apache_getenv, apache_reset_timeout, apache_setenv, unregister_tick_function, rpc, exec, system, passthru, shell_exec, proc_open, pcntl_exec رو در disable_functions قرار بدید.
در حالت معمولی دلیلی ندارید که safe_mode رو On قرار بدید.
و...
10- یک فایل htaccess (برای وب سرور های آپاچی و امثلالش) یا ht(برای nginx و امثالش) درست کنید(برای نرم افزارتون) و تنظیمات(اختیاری) زیر رو درونش قرار بدید(در حالت عادی):
(این فایل رو در پوشه(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 استفاده نکنید تا در صورت نبودن فایل ضمیمه شده، صفحه Terminate/Exitبشه. دلیلتون برای استفاده چیه؟ (اینها فقط Option های اضافی PHP هستند).
15- آدرس(Path) کامل رو برای ضمیمه هر فایلی بنویسید. این کار سرعت پیدا/Solve کردن Path رو توسط سرور افزایش میده(Steelsheet ها، JavaScript ها، require ها و...).
16- پیشنهاد: بعد از نصب/پیکربندی نرم افزار، حتماً پوشه/فایل Install و Setup رو حذف کنید.
17- از دستور switch بجای شروط if استفاده کنید. اینکار سرعت پردازش/Compile رو افزایش میده.
18- از @ برای ignore کردن خطا(Error suppression) در توابع/دستورات طولانی/سنگین/پر کاربرد استفاده نکنید. این کار سرعت موتور PHP رو برای پردازش/Compile خیلی کاهش میده.
19- متغیر ها، آرایه ها، درخواستهای HTTP و... رو بعد از استفاده حتماً Unset/خنثی کنید. و یا برابر با NULL قرارش بدید.
20- کدها/اسکریپتهای کوتاه رو در فایل HTML قرار بدید نه در فایل PHP. این کار سرعت سرور وب رو برای پردازش/Compile خیلی افزایش میده.
21- بعد استفاده از session حتماً اون رو destroy و unset کنید:
session_unset و session_destroy
اغلب PHP نویسان به session_destroy کفایت می کنن. در صورتی که unset یه چیزه destroy چیزه دیگست...
و آخر اینکه مراقب تصاویری که Upload میشن باشید.
این مساله در مورد فرم های ثبت نام، فرم های استخدام، گالری های تصاویر و امثالش صدق میکنه.
باید مطمعن بشید که فایل Upload شده تصویری هستش، در غیر این صورت با همچین چیزی مواجه میشید:
مثال ساده محتوای یک فایل تصویری:
برای جلوگیری از اینکار، سایز/اندازه/پیکسل تصویر رو بگیرید... اگر فاقد اینها بود فایل تصویری نیست.
امید وارم این مقاله براتون پرکاربرد و مفید واقع بشه... احتمالاً این آخرین مقاله در این زمینه خواهد بود.
موفق باشید.
نکات و اصول مهم در برنامه نویسی(3#):
اگر این مقاله براتون مفید و موثر واقع شد، مقالات قبلیم در رابطه با همین موضوع رو می تونید در "نکات و اصول مهم در برنامه نویسی(1#)" و "نکات و اصول مهم در برنامه نویسی(2#)" دنبال کنید.
1- حملات DOS/DDOS
ساده ترین و عامیانه ترین عواملی که باعث میشن: پهنای باند پایین، پیکربندی نامناسب سرور وب و استفاده از نرم افزار های سنگین(نیوک ها، تالار/انجمن ها...) برای کارهای سبک و غیر استاندارد در فضاهای کوچیک هستش.
راه حل ها(در مورد همه زبانهای تحت وب صدق میکنه): پهنای باند حداقل 500 مگابایت، محدود کردن حجم هر بسته(HTTP post) نسبت به پهنای باند، محدود کردن حجم هر درخواست(Body request) نسبت به پهنای باند، محدود کردن حجم Upload فایل نسبت به پهنای باند، استفاده از فشرده سازی محتوا(Output)/Cache، محدود کردن زمان Excute نرم افزار(مثلاً 60 ثانیه)، بهینه سازی/استاندارد سازی محتوای 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 ها صدق میکنه): [LTR]default charset= 'utf8' collate= 'utf8_general_ci';[/LTR]
4- از قرار دادن فضا های خالی بی مورد و Comment های بیجا و نامناسب خودداری کنید. اینها تقریباً 10% از حجم کل نرم افزارتون رو اشغال می کنند(Web programming می کنید نه Desktop programming).
5- حتالمکان توابع رو در کلاس بصورت static تعریف کنید، چراکه سرعت پردازش/Compile رو بسیار بسیار افزایش میده. همچنین بدون ساخت شی قابل دسترسی هست(مخصوصاً توابع طولانی و سنگین).
6- به هیچ وجه از دستور print در برنامه های تحت وب استفاده نکنید(هزاران بار گفته شده). دلیلتون برای استفاده چیه؟!
7- در هنگام نصب جداول از بودن یا نبودن جدول مطلع بشید تا هنگام نصب/پیکربندی با خطا مواجه نشین. راه ساده: [LTR]drop table if exists `xxxxx`;
create table if not exists `xxxxx`;[/LTR]
8- برای Database تون Password تعیین کنید. اغلب Database ها بصورت پیش فرض Password هایی برای مدیر دارند، که خرابکار با بدست آوردن Username براحتی وارد Database خواهد شد و...
9- تنضیمات پیشنهادی برای PHP:
asp_tags رو Off قرار بدید.
implicit_flush رو On قرار بدید.
expose_php رو Off قرار بدید.
max_execution_time رو 30 قرار بدید.
max_input_time رو 30 قرار بدید.
default_socket_timeout رو 30 قرار بدید.
register_globals رو Off قرار بدید(هزاران بار گفته شده).
session.auto_start رو 0 قرار بدید.
default_mimetype رو text/html قرار بدید(سرعت بیشتر).
display_errors رو 1 قرار بدید.
بهتره log_errors رو On قرار بدید.
بهتره 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 قرار بدید.
mbstring.func_overload رو 0 قرار بدید(http://bugs.php.net/bug.php?id=30766).
توابع apache_child_terminate, apache_getenv, apache_reset_timeout, apache_setenv, unregister_tick_function, rpc, exec, system, passthru, shell_exec, proc_open, pcntl_exec رو در disable_functions قرار بدید.
در حالت معمولی دلیلی ندارید که safe_mode رو On قرار بدید.
و...
10- یک فایل htaccess (برای وب سرور های آپاچی و امثلالش) یا ht(برای nginx و امثالش) درست کنید(برای نرم افزارتون) و تنظیمات(اختیاری) زیر رو درونش قرار بدید(در حالت عادی):
کد:
<Limit PUT DELETE>
Order Allow,Deny
Deny from all
</Limit>
<LimitExcept POST GET HEAD OPTIONS>
Order Allow,Deny
Deny From All
</LimitExcept>
ServerSignature Off
#LimitRequestBody 1024
#LimitXMLRequestBody 1024
AddType application/x-httpd-php .php .php3 .php4 .php5 .php6 .html .xml .phphtml .phpxml .ph .px .shtml
AddType application/x-httpd-php-source .ps
AddType text/x-component .htc
AddHandler application/x-httpd-php .php .php3 .php4 .php5 .php6 .html .xml .phphtml .phpxml .ph .px .shtml
<IfModule dir_module>
DirectoryIndex index.php index.php3 index.php4 index.php5 index.php6 index.html index.xml index.phphtml index.phpxml index.ph index.px index.shtml
</IfModule>
Options +Indexes -Includes +ExecCGI -MultiViews
#Options None
#DefaultLanguage en
AddCharset UTF-8 .utf8
#AddDefaultCharset utf-8
Header Unset ETag
Header set X-UA-Compatible "IE=EmulateIE7"
Header set X-UA-Compatible "IE=EmulateIE8"
# Anti-ClickJacking(Ms Internet Explorer 8)
Header append X-FRAME-OPTIONS "DENY"
#SetEnvIfNoCase Referer "^http://www.doman/" locally_linked= 1
#SetEnvIfNoCase Referer "^http://www.domain$" locally_linked= 1
#SetEnvIfNoCase Referer "^http://domain/" locally_linked= 1
#SetEnvIfNoCase Referer "^http://domain$" locally_linked= 1
#SetEnvIfNoCase Referer "^$" locally_linked= 1
#<FilesMatch "\.(gif|png|jpe?g)$">
#Order Allow,Deny
#Allow from env=locally_linked
#</FilesMatch>
FileETag none
# Apache 2.x.x
#SSLOptions +StdEnvVars +ExportCertData
<IfModule mod_security.c>
SecFilterEngine Off
</IfModule>
<IfModule security2_module>
SecRuleEngine Off
</IfModule>
#RedirectMatch 403 /(tmp/cache|/logs|\.svn)(/|$)
<Files ~ "\.(pkg-info|manifest|.ht)$>
Order Allow,Deny
Allow from localhost
Allow from 127.0.0.1
Deny From All
</Files>
<FilesMatch "\.(htaccess|session|htpasswd|passwd)$">
Order Allow,Deny
Allow from localhost
Allow from 127.0.0.1
Deny from all
</FilesMatch>
<IfModule mod_deflate>
AddOutputFilterByType DEFLATE application/x-javascript text/css text/html
</IfModule>
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 استفاده نکنید تا در صورت نبودن فایل ضمیمه شده، صفحه Terminate/Exitبشه. دلیلتون برای استفاده چیه؟ (اینها فقط Option های اضافی PHP هستند).
15- آدرس(Path) کامل رو برای ضمیمه هر فایلی بنویسید. این کار سرعت پیدا/Solve کردن Path رو توسط سرور افزایش میده(Steelsheet ها، JavaScript ها، require ها و...).
16- پیشنهاد: بعد از نصب/پیکربندی نرم افزار، حتماً پوشه/فایل Install و Setup رو حذف کنید.
17- از دستور switch بجای شروط if استفاده کنید. اینکار سرعت پردازش/Compile رو افزایش میده.
18- از @ برای ignore کردن خطا(Error suppression) در توابع/دستورات طولانی/سنگین/پر کاربرد استفاده نکنید. این کار سرعت موتور PHP رو برای پردازش/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...
?>
یا
...
امید وارم این مقاله براتون پرکاربرد و مفید واقع بشه... احتمالاً این آخرین مقاله در این زمینه خواهد بود.
موفق باشید.
آخرین ویرایش: