**[color=#FF0000]۱- [/color]**هرگز فایل های ضمیمه شده رو با پسوند inc. ذخیره نکنید! یعنی name.class.inc رو به name.class.php تغییر بدید. و یا از .HTAccess برای سطح دسترسی inc. استفاده کنید.
**[color=#FF0000]۲- [/color]**حتاًالمکان تگ های اضافی و فضا های خالی را حذف کنید و از باز و بسته کردن بیش از حد تگهای سرور (<?php ?> <? ?> <?= ?>) خودداری کنید. در عمل تفاوتی ندارند ولی در حجم و سرعت، به ازای هر ۱ کاراکتر اضافی ۱ بایت حجم فایل و صفحه و Loading میبره بالا(مخصوصاً در پروژه های سنگین)!
[color=#FF0000]۳-[/color] کلاس های خود را با قرار دادن ; کامل ببندید و کلاس را با Final و Initialize/__construct شروع کنید تا Clone نشوند:
final class Name
{
final public function __construct()
{
#…
}
};
[color=#FF0000]4-[/color] برای Escape کردن کاراکترهای ویژه و جلوگیری از خیلی از حملات SQL از دستورات زیر استفاده کنید:
get_magic_quotes_gpc ? $Str_Input= @stripslashes($Str_Input) : $Str_Input= @addslashes($Str_Input);
if(
function_exists(‘mysql_real_escape_string’)): @mysql_real_escape_string($Str_Input);
else: @mysql_escape_string($Str_Input);
endif;
[color=#FF0000]5-[/color] در کلاس خود از تابع پیش فرض clone__ برای جلوگیری از تقلید(Clone)(شبیه سازی) توابع استفاده کنید:
final public function __clone()
{
return(@exit(‘Cloning is not allowed.’));
}
[color=#FF0000]6-[/color] هرگز از Cookie/Session برای ذخیره کلمه رمز یا مقادیر نمایشی استفاده نکنید(قابل تغییر هستند). خیلی ها از جمله … این مورد رو در نرم افزارشون رعایت نمی کنند و بارها آسیب های جدی و پیش پا افتاده ای رو متحمل میشن.
**[color=#FF0000]۷- [/color]**در خط اول هر فایل PHP، بعد از خطا زدایی کامل صفحه، دستور (error_reporting(E_ALL@ را قرار بدید که تمامی خطا ها و هشدار ها رو نمایش بده. تا از سو استفاده های احتمالی جلوگیری بشه.
**[color=#FF0000]۸- [/color]**حتاًامکان از دستور GET_$ برای دریافت مقادیر استفاده نکنید. و به جاش از دستور REQUEST_$ استفاده کنید(مقدارش رو هم فیلتر کنید).
مقادیر متد GET_$، براحتی قابل Sniff و Steal هستند. همچنین ظرفیت این متد حداکثر ۱۰۰ کاراکتر هستش و تمام پارامترهای URL رو هم نوار آدرس مرورگر در معرض دید میزاره.
ولی متد REQUEST_$، هیچ کدوم از این ضعف ها رو نداره و قدرت پیمایشش هم بیشتره.
اینم یه مثال ساده برای معتبر سازیش:
$Int_Identity= (int)@preg_replace(‘/[^0-9]/i’, ”, $_REQUEST['Id']);
**[color=#FF0000]9- [/color]** حتماً تمامی دستورات Exit و Die رو با Ignore کردن خطا @ و بستن محتوا استفاده کنید:
کد PHP:
@exit(”); یا @die(”);
[color=#FF0000]10- [/color] در اول هر کلاس و تابع حتماً وجود و بودن کلاس و تابع رو چک کنید!
if(!extension_loaded(’standard’)): @exit(‘Extension Standard not loaded!’);
elseif(!extension_loaded(‘mysql’)): @exit(‘Extension MySQL not loaded!’);
elseif(!class_exists(‘ClassName’)): @exit(‘Class ClassName not exists!’);
endif;
…
if(function_exists(‘mysql_real_escape_string’)): @mysql_real_escape_string(…);
else: @mysql_escape_string(…);
endif;
[color=#FF0000]11-[/color] هرگز از روش زیر برای آدرس دهی(Action) استفاده نکنید:
<form name=”Frm_Test” action=”<?= $_Server['PHP_Self'] ?>“ method=”post” target=”_self”>
…
</form>
چراکه قابل تغییر و دستکاری هستند(برای حملات (XSS(Cross Side Scripting).
راه حل:
$_PHPSelf= @basename(__File__);
$_Server['PHP_Self]= @substr($_Server['PHP_Self'], ۰, @strpos($_Server['PHP_Self], $_PHPSelf)) . $_PHPSelf;
**[color=#FF0000]12-[/color]** حتماً تمامی خروجی ها رو به نوع مربوطش تبدیل کنید:
کد PHP:
echo((string)‘Test ’ . $_Var_Test);
return((string)
$_Str_Test);
return((integer)
$_Int_Test);
[color=#FF0000]13- [/color] و در آخر، بهتر و ایمن تره اگر تمامی تگ ها و بلاک ها رو کامل مشخص کنید و کامل ببندید:
حافظه هم دچار مشکل نمیشه.
if(…): …
endif;
if(…): …
else(…): …
endif;
if(…): …
elseif(…): …
else(…): …
endif;
if(…)
{
…
};
if(…): …
{
…
}
else
{
…
};
while(…):
endwhile;
while(…)
{
};
for…
foreach…
…
مجموعه مشخصی از اشتباهات و آسیب ها و ضعف های نرم افزاری غالباً تکراری رخ می دهند!
که چیزی جز خجالت و خسارت بدنبال نداره. و این آخر جهل و نادانی رو میرسونه. اگر یه سری به SecurityFocus.com/archive، MilW0rm.com، Net-Security و غیره برنید متوجه این موضوع میشید. پس اگر برنامه نویس هستید، حتماً از آخرین رویداد ها و اخبار امنیتی نرم افزارها مطلع باشید.
[color=#FF0000]۱۴-[/color] هرگز از SQLite برای نرم افزارهای سنگین استفاده نکنید!
شاید SQLite نقات قوت زیادی داشته باشه(از جمله مستقل بودن)، ولی در رابطه با نرم افزارهای سبک!
در نرم افزارهای سنگین،
اولیش: عدم نیاز به پردازش سرور! در ظاهر یه نقطه قوت هست، ولی نداشتن پردازش سرور، مجموعه ای از مشکلات بزرگ و خطرناکی رو بهمراه داره: از قبیل قفل فایل، مسایل همزمانی، مشکلات حافظه، نداشتن کش Query، مشکلات باینری، مشکلات سرریز شدن(Overflow) داده های سنگین و مشکلات مقیاسی هنگام برخورد با توده عظیمی از اطلاعات!
دومیش: باینری نا امن! SQLite اطلاعات باینری رو نمیتونه Handle کنه. برای Insert کردن داده از نوع باینری، ابتدا باید آنرا Encode کنید. بهمین شکل باید تا آخر، پس از یک Select، داده رو هی Encode/Decode کنید!
**سومیش:**همه جداول را قفل می کنه! اکثر پایگاه های داده جداول انفرادی(یا حتی سطر ها) رو در حین انجام عملیات قفل می کنند، اما SQLite خفنه و بخاطر کاربردش، همه پایگاه داده رو در حین عملیات قفل میکنه . که این Read/Write همزمان رو بسیار کند میکنه! و مشکلات عمده و بزرگ دیگه ای از این قبیل رو بهمراش میاره!
پس هرگز از SQLite برای نرم افزار های سنگین(با داده های سنگین) استفاده نکنید!
[color=#FF0000]۱۵-[/color] بعد از هر بار استفاده از متغیرها، آرایه ها، شی ها، کلاس ها و غیره… اگر دیگر مقدار آنرا آدرسی دهی نمی کنید اون رو خنثی(یا آزاد) کنید. با این کار سرعت عمل حافظه و پردازش اطلاعات و امنیت اطلاعات رو بالا می برید(این امر در مورد دیگر زبانهای برنامه نویسی هم صدق می کنه).
در PHP:
با دستور ()unset.
مخصوصاً درخواستهای HTTP رو! مثل$_GET, $_POST, $_REQUEST
. این طوری از Steal و Sniff کردن مقادیرشون هم جلوگیری میشه(تا حد زیادی).
**[color=#FF0000]۱۶- [/color]**اگر به قاعده های توابع موجود در بسته PCRE مسلط نیستید یا به صحت قواعدتون شک دارید برای فیلتر کردن ورودیها/خروجیها استفاده نکنید. اینها توابعی بسیار دقیق در عین حال خیلی حساس هستند. از توابع خود بسته Standard استفاده کنید. بهینه تر هم هست(اگر نیازی به قواعد ندارید).
حتی سرعت برخی توابعی که در بسته Standard هستش از توابع موجود در بسته PCRE خیلی بیشتره! نمونش: سرعت عمل تابع str_replace نسبت به تابع preg_replace، دقیقاً ۲۰% بیشتره(با مثال هم نشون میدم).
[color=#FF0000]۱۷- [/color] در زبانهای برنامه نویسی استاندارد(به غیر از VB و +A شاید Delphi) وقتی شما دستوری رو می نویسید و اجرا می کنید، حافظه پایان اون دستور رو ; یا همون نقطه ویرگول می دونه و یکی از ریز دلایلی که باعث شد استاندارد معرفی بشن همینه.
عدم رعایتش باعث: کندی در پردازش، آسیب پذیری، سردرگمی در بررسی اولیه صحت دستورات، اشغال فضای حافظه(غیر قابل تخلیه)، بروز خطا(در نرم افزارهای سنگین) و از این قبیل هستش!
مثال صحیح(تکرار):
if($_X)
{
};
for(
$_X; …)
{
};
if(
$_X): …
endif;
for(
$_X; …): …
endfor;
class
X
{
};
و
…
[color=#FF0000]۱۸-[/color] حتاامکان همه پارامترها، مقادیر، دستورات و غیره… رو تعریف کنید و بحالت پیش فرض رهاش نکنید تا خرابکار(خارج از نرم افزار) سو استفاده و تعریفش نکنه!
...