TAHA
11-05-2009, 11:15 AM
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.
پیشنهاد می کنم شما هم نداشته باشید.
برای این مقاله کافی هستش. شما می تونید خیلی از این نکات و اصول رو در خیلی از زبانهای دیگه بکار ببندید و از نتیجش لذت ببرید.
در مقاله بعدی(3#) تعداد دیگه ای از این نکته ها و اصول مهم رو می نویسم(سطح متوسط).
موفق باشید.
شاید 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.
پیشنهاد می کنم شما هم نداشته باشید.
برای این مقاله کافی هستش. شما می تونید خیلی از این نکات و اصول رو در خیلی از زبانهای دیگه بکار ببندید و از نتیجش لذت ببرید.
در مقاله بعدی(3#) تعداد دیگه ای از این نکته ها و اصول مهم رو می نویسم(سطح متوسط).
موفق باشید.