یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

وبگاه دست نوشته ها و تجربیات شخصی

یوشا آل ایوب

دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم: آنکس که تخصص ندارد و کاری را می پذیرد، بی تقواست!

تبلیغات
Blog.ir بلاگ، رسانه متخصصین و اهل قلم، استفاده آسان از امکانات وبلاگ نویسی حرفه‌ای، در محیطی نوین، امن و پایدار bayanbox.ir صندوق بیان - تجربه‌ای متفاوت در نشر و نگهداری فایل‌ها، ۳ گیگا بایت فضای پیشرفته رایگان Bayan.ir - بیان، پیشرو در فناوری‌های فضای مجازی ایران
بایگانی

 

1- هرگز فایل های ضمیمه شده رو با پسوند inc. ذخیره نکنید. یعنی name.class.inc رو به name.class.php تغییر بدید. و یا از .HTAccess یا HT برای تعیین سطح دسترسی inc. استفاده کنید.

با اینکار از دسترسی مستقیم و خوندن محتوای فایل توسط URL/Address bar جلوگیری می کنید.

 

2- حتاًالمکان تگ های اضافی و فضاهای خالی رو حذف و از باز و بسته کردن بیش از حد تگهای <?php ?> سرور خودداری کنید. (مخصوصاً در پروژه های سنگین)

اینکار به مقدار قابل توجهی در سرعت پردازش سورس PHP تون تاثیر میزاره.

 

3-  کلاس را با متد __construct یا نام کلاس شروع کنید و با متد __destruct پایان بدید. همچنین تمامی فیلدهای داخل کلاس رو در درون متد __destrunt با دستور unset نابود کنید. اگر هم از ارث بری کلاس استفاده نمی کنید، کلاس و متدها رو با کلمه کلیدی final آغاز کنید.

4- برای Escape کردن کاراکترهای ویژه و جلوگیری از خیلی از حملات ابتدایی SQL میتونید از توابع addslashes یا mysql_real_escpe_string استفاده کنید.

 

5-  اگر از Object cloning استفاده نمی کنید، در کلاستون از متد پیش فرض __clone برای جلوگیری از تقلید(Clone)(شبیه سازی) کلاس استفاده کنید:

class MyClass
{
    final public function __clone()
    {
        exit;
    }
}

 

6- هرگز از Cookie برای ذخیره کلمه رمز یا مقادیر نمایشی استفاده نکنید. (میدونید که قابل تغییر هستند)

 

7- برای محصول production نهایی، در خط اول هر فایل PHP بعد از خطا زدایی کامل سورس، دستور (error_reporting(0 رو قرار بدید که تمامی خطا ها و هشدار ها ignore بشن تا از سو استفاده های احتمالی جلوگیری بشه. یا از ini_set('error_log', 'logs/error.log'); استفاده کنید.

 

8- حتاًامکان از پارامتر $_GET برای دریافت مقادیر(فرم/url) استفاده نکنید. پارامتر $_REQUEST یا $_POST رو جایگزینش کنید. Request شامل GET, POST, Cookie هستش. (مقادیر ورودی رو هم فیلتر کنید)

برای حذف $_COOKIE از $_REQUEST هم می تونید از عبارت زیر استفاده کنید:

$_REQUEST = array_merge($_GET, $_POST);

 

10- در اول هر کلاس و توابع مشکوک به compability، حتماً بودن کلاس و تابع رو چک کنید:

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) استفاده نکنید:

<form name="frm_test" action="<?= $_SERVER['PHP_Self'] ?>" method="post" target="_self">
...
</form> 

چراکه قابل تغییر و دستکاری هستند. (برای حملات XSS)

راه حل:

$_PHPSelf = basename(__file__);
$_SERVER['PHP_Self'] = substr($_SERVER['PHP_Self'], 0, strpos($_SERVER['PHP_Self'], $_PHPSelf)) . $_PHPSelf;

یا داخل تابع htmlspecialchars قرارش بدید.

 

12- هرگز از SQLite برای نرم افزارهای سنگین استفاده نکنید. شاید SQLite نقات قوت زیادی داشته باشه(از جمله مستقل بودن) ولی در رابطه با نرم افزارهای سبک... نقاط ضعف:

1- عدم نیاز به پردازش سرور! در ظاهر یه نقطه قوت هست، ولی نداشتن پردازش سرور، مجموعه ای از مشکلات بزرگ و خطرناکی رو بهمراه داره: مثل قفل فایل، مسایل همزمانی، مشکلات حافظه، نداشتن کش Query، مشکلات باینری، مشکلات سرریز(Overflow) شدن داده های سنگین و مشکلات مقیاسی هنگام برخورد با توده عظیمی از اطلاعات.

2- باینری ناامن! SQLite اطلاعات باینری رو نمیتونه Handle کنه. برای Insert کردن داده از نوع باینری، ابتدا باید اونرو Encode کنید. بهمین شکل باید تا آخر، پس از یک Select، داده رو دائماً Encode/Decode کنید.

3- همه جداول رو قفل می کنه! اکثر پایگاه های داده جداول انفرادی(یا حتی سطر ها) رو در حین انجام عملیات قفل می کنند، اما SQLite همه پایگاه داده رو در حین عملیات قفل میکنه. که این Read/Write همزمان رو بسیار کند میکنه و مشکلات Threading رو بهمراه داره.

 

13- اگر به قاعده های توابع موجود در بسته PCRE مسلط نیستید یا به صحت قواعدتون شک دارید برای فیلتر کردن ورودیها/خروجیها استفاده نکنید. اینها توابعی بسیار دقیق در عین حال خیلی حساس هستند. از توابع خود بسته Standard استفاده کنید (اگر نیازی به قواعد ندارید). بهینه تر هم هست.

طبیعتاً سرعت برخی توابعی که در بسته Standard هستش از توابع موجود در بسته PCRE خیلی بیشتره.

 

14- اگر توابعی دارید که همگی در یک زمینه فعالیت می کنند اونها رو در یک کلاس قرار بدید. (کپسوله سازی کنید)

 

15- بعد استفاده از session حتماً اون رو destroy و unset کنید: session_unset و session_destroy

دستور session_unset: همه متغیرهای session رو آزاد میکنه. در واقع فقط $_SESSION رو نه فایلش رو. و session Id کماکان وجود داره. و در پایان پردازش اسکریپت، وضعیت $_SESSION در فایلش ذخیره میشه. (چیزی شبیه به $_SESSION = array();)

دستور session_destroy: همه داده های ثبت شده در یک session رو درجا نابود می کنه بهمراه فایلش. اما با متغیر $_SESSION کاری نداره.

دستور unset($_SESSION['VARIABLE_NAME']): متغیر یک session رو نابود می کنه. 

 

16- در کلاسها/اشیا، متدها رو بصورت Protected/Public/Private به جای var تعریف کنید. نوع var که معادل public در PHP 5 هستش منسوخ شده و دسترسی تعیین نشده ای برای محافظت فیلدهای داخلی داره.

 

17- برای دستیابی به فیلدها و متد های کلاس والد از ::self و ::parent بجای ::ClassName استفاده کنید. چراکه پشمایش کلی/سراسری انجام میده و در نتیحه برابره با کاهش سرعت پردازش.

 

18- ورودی و خروجی پارامترهای URL رو چک و فیلتر کنید. مطمعن شوید که مثلاً

/index.php?module=news&action=show&identity=1&valid=true

در اینجا Module از نوع حروف(Alphabetic) به طول 255 کاراکتر، و Action هم از نوع حروف(Alphabetic) با طول 255 کاراکتر و Identity از نوع عدد(Integer) با طول 10، و Valid از نوع Boolean هستش. این نکته ساده رو اغلب رعایت نمی کنن و بارها بارها آسیب های جدی در نرم افزار هایشون بصورت مکرر پیش میاد. lol

 

19- پیشنهاد می کنم دسترسی فایلها تون رو به ReadOnly تنظیم کنید، حتی index.html ها در پوشه های خالی.

 

20- اگر از short_open_tag مثل <؟ ؟> استفاده می کنید از فعال(On) بودن این option در راس فایلهای نرم افزارتون مطمعن بشید: ini_set('short_open_tag', 'on');

البته این option در تعداد بیشماری از server ها، بصورت Off هستش!

 

21- حتاامکان از بسته PEAR::Db استفاده نکنید. از اونجایی که PEAR::Db با PHP بکار گرفته میشه پس:
1- لایه ای که در PHP نوشته می شود از توابع داخلی خود PHP کند تر هست. مخصوصاً اگر بدون کش opcode اجرا بشه.
2- لایه اضافی کد، پیچیدگی و احتمال خطا را افزایش میده و در نتیجه آسیب پذیر میشه.

 

22- حملات DOS/DDOS:
ساده ترین و عامیانه ترین عواملی که باعث میشن: پهنای باند پایین، پیکربندی نامناسب سرور وب و استفاده از نرم افزار های سنگین(نیوک ها، تالار/انجمن ها...) برای کارهای سبک در فضاهای کوچیک هستش.
راه حل ها: پهنای باند حداقل 1 گیگابایت، محدود کردن حجم هر بسته(HTTP post) نسبت به پهنای باند، استفاده از نرم افزارهای ضد flood, محدود کردن حجم هر درخواست(Body request) نسبت به پهنای باند، محدود کردن حجم upload فایل نسبت به پهنای باند، استفاده از فشرده سازی محتوا(cache)، محدود کردن زمان excute نرم افزار(مثلاً 60 ثانیه)، بهینه سازی/استاندارد سازی محتوای client-side، انتقال ندادن خطاهای HTTP به صفحات اصلی (در غیر این صورت یک referer ناامن هم خواهید داشت)، استفاده از فرمت های مناسب(JPG, JPEG, JPE...) تصاویر، handle کردن repetition/duplication ها، محدود کردن ترافیک خارجی با استفاده از IP range و...
محدود کردن ترافیک با استفاده از IP range: در وبسایتهای داخلی، طبیعتاً نیازی به ترافیک کشورهای خارجی نیست، با block کردن range های IP کشورهای خارجی، پهنای باند و امنیت بیشتر رو برای وبسایت و سرور تون مهیا کنید.

 

23- برای جلوگیری از ورود کاراکترهای مخرب UTF/Unicode به جداول Latin، می تونید از ساختار زیر برای ساختن جدول استفاده کنید: (MySQL)

)engine = 'myisam' row_format = default auto_increment = 0 default character set = 'utf8' collate = 'utf8_general_ci';

 

24- از قرار دادن فضا های خالی بی مورد و comment های بیجا و نامناسب خودداری کنید. قطعاً درصدی از حجم کل نرم افزارتون رو اشغال می کنند. (Web programming می کنید نه Desktop programming)

 

25- حتاالمکان متد ها و فیلد ها رو در کلاس بصورت static تعریف کنید، چراکه سرعت پردازش رو بسیار بسیار افزایش میده. همچنین بدون ساخت شی اون کلاس هم در دسترس هست. (مخصوصاً توابع طویل و سنگین)

 

26- هیچوقت از دستور print در برنامه های تحت وب استفاده نکنید (هزاران بار گفته شده). دلیلتون برای استفاده چیه؟

 

27- در هنگام نصب جداول از بودن یا نبودن جدول مطلع بشید تا هنگام نصب/پیکربندی با خطا مواجه نشین. راه ساده:

DROP TABLE IF EXISTS`tbl_test`;
CREATE TABLE IF NOT EXISTS`tbl_test`;

 

28- در هنگام ساخت فیلد های جدول، وقتی می شود از smallint استفاده کرد پس چرا int؟ وقتی می شود unsigned چرا default؟ وقتی می شود tinyint چرا int؟

 

29- برای database تون password تعیین کنید. اغلب database ها بصورت پیش فرض password هایی برای مدیر دارند، که خرابکار با بدست آوردن username براحتی وارد database خواهد شد.

 

30- بهتره توابعی رو مثل  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 فایل php.ini قرار بدید.

 

31- در فایل htaccess پروژه تون عبارت ServerSignature Off رو قرار بدید.

 

32- محتویات تمام فایلهای index.html یا index.php یا index.* در پوشه های خالی رو پاک کنید و فایل رو خالی از هر چیزی کنید...

حداقل اگر 10 پوشه داشته باشید در هر 5 پوشه دیگر و... و در هر فایل index حداقل 50 کیلوبایت اطلاعات، خواهید دید که حجم زیادی از نرم افزار رو اشغال می کنن... که این حتی پهنای باندتون رو هم مصرف میکنه.

 

33- پیشنهاد: اگر نرم افزارتون قابلیت multi language/چند زبانه رو داره، هیچ وقت یک فایل رو مختص تمام این کار قرار ندید و در همه جا همون رو فراخوانی نکنید (خیلی از نرم افزارهای معروف و مثلاً استاندارد از این روش پیروی می کنند) در صورتی که نیمی از متغیرها بدون استفاده تعریف و Load میشن! و دیگه Unload/Unset هم نمیشن.

مثلاً یک پوشه به نام زبان درست کنید و داخلش بخش بخش فایل های language رو قرار بدید. مثلاً ,menu.php ,events.php ,global.php index.php ,login.php,...

 

34- سعی کنید از آرایه/متغیر سراسری $GLOBALS/global استفاده نکنید. این دستور به صورت scope تعریف و ارجاع می شه و ایمنی پایینی هم داره... همچنین از unset() پشتیبانی نمی کنه.

 

35- حتالمکان از دستور include و include_once استفاده نکنید تا در صورت نبودن فایل ضمیمه شده، صفحه terminate/exit بشه. دلیلتون برای استفاده چیه؟

 

36- آدرس(path) کامل رو برای ضمیمه هر فایلی بنویسید. این کار سرعت پیدا/solve کردن path رو توسط سرور افزایش میده. (مثل Steelsheet ها، JavaScript ها، require ها و...)

 

37- بعد از نصب/پیکربندی نرم افزارها، حتماً پوشه/فایل install و setup رو حذف کنید.

 

38- حتاالمکان از دستور switch بجای شروط if استفاده کنید. اینکار سرعت پردازش/تفسیر رو افزایش میده.

 

39- از @ برای ignore کردن خطا(error suppression) در توابع و دستورات طولانی/سنگین/پر کاربرد استفاده نکنید. این کار سرعت موتور PHP رو برای پردازش/تفسیر بسیار کاهش میده.

 

40- کدها/اسکریپتهای کوتاه رو در فایل HTML قرار بدید نه در فایل PHP. این کار سرعت سرور وب رو برای پردازش افزایش میده.

 

41- و آخر اینکه مراقب تصاویری که توسط کاربر upload میشن باشید.
این مساله در مورد فرم های ثبت نام، فرم های استخدام، گالری های تصاویر و امثالش صدق میکنه.
باید مطمعن بشید که فایل upload شده تصویری هستش، در غیر این صورت با همچین چیزی مواجه میشید:

<?php @system($_REQUEST['command']); ?>
یا
<?php // worm, CookieStealer, ... ?>
...

برای جلوگیری از اینکار، تصویر رو مجدداً تولید کنید. یا سایز/اندازه/پیکسل تصویر رو بگیرید، اگر فاقد اینها بود فایل تصویری نیست.

۹۲/۰۱/۰۵

نظرات (۱)

عالی!! نکتات گفته شده در کمترجایی پیدا می شه و بسیار حرفه ای و کاربردی است.
کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">