یوشا

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

یوشا

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

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

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

 

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

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

 

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

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

 

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

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

نکته: البته صددرصد بهتره که از کتابخانه PDO بجای کتابخانه MySQLi و امثالش استفاده کنید.

 

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

class MyClass
{
    final public function __clone()
    {
        exit; // or Throw exception
    }
}

 

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

 

7- همیشه در محیط production نمایش خطاها رو خاموش و log خطاها رو روشن کنید. اما در محیط development یا debug mode نمایش خطاها رو روشن کنید.

error_reporting(E_ALL); // Error/Exception engine, always use E_ALL

ini_set('ignore_repeated_errors', TRUE); // always use TRUE

ini_set('display_errors', FALSE); // Error/Exception display, use FALSE only in production environment or real server. Use TRUE in development environment

ini_set('log_errors', TRUE); // Error/Exception file logging engine.
ini_set('error_log', 'your/path/to/errors.log'); // Logging file path

 

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 رو بهمراه داره.

4- دسترسی remote به دیتابیس ندارید.

 

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

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

 

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

 

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

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

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

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

نکته 2: دستور session_regenerate_id(true); صرفاً session ID جاری کاربر رو تغییر میده و session ID قدیمی کاربر رو نامعتبر میکنه.

 

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

 

17- جهت جلوگیری از برخی حملات PHP Object Injection ، از توابع JSON بجای تابع serialize() استفاده کنید.

 

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

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

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

 

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:
ساده ترین و عامیانه ترین عواملی که باعث میشن: پهنای باند پایین، پیکربندی نامناسب سرور وب و استفاده از نرم افزار های سنگین(نیوک ها، تالار/انجمن ها...) برای کارهای سبک در فضاهای کوچیک هستش.
راه حل ها: پهنای باند حداقل 10 گیگابایت، محدود کردن حجم هر بسته(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)

default character set = 'utf8' collate = 'utf8_general_ci';

 

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

 

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_reset_timeout,

unregister_tick_function,rpc,exec,

dl,show_source,apache_note,apache_setenv,closelog,debugger_off,debugger_on,define_syslog_variables,

escapeshellarg,escapeshellcmd,ini_restore,openlog,passthru,pclose,pcntl_exec,popen,proc_close,

proc_get_status,proc_nice,proc_open,proc_terminate,shell_exec,syslog,system,url_exec رو در قسمت disable_functions فایل php.ini قرار بدید.

 

31- در فایل htaccess پروژه تون عبارت ServerSignature Off رو قرار بدید تا برخی اطلاعات سرور از دست هکرها مخفی بمونه.

 

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

 

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 برای فایلهای php استفاده نکنید تا در صورت نبودن فایل ضمیمه شده، صفحه terminate/exit بشه.

 

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

 

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

 

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

 

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

 

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

 

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

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

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

 

مقالات مرتبط

#2 - نکات و اصول مهم در برنامه نویسی PHP

#3 - نکات و اصول مهم در برنامه نویسی PHP

#4 - نکات و اصول مهم در برنامه نویسی PHP

 

۹۲/۰۱/۰۵

نظرات (۴)

۰۳ فروردين ۹۷ ، ۲۳:۵۹ compraventa relojes madrid
Sweet blog! I foսnd iit whilpe browsing ᧐n Yahoo News.
Ɗo you hve anny tips on how to ցet listed in Yahoo News?
Ӏ'ѵe beеn tryіng foг a while bսt I nevеr seerm to get theгe!
Cheers
پاسخ:
What do you mean? I don't get it
درموردِ 26 امی:
یعنی echo کنیم؟
توی سرعت تفاوت داره یا امنیت؟
پاسخ:
اره، echo کنید
هم کمی سریعتره هم چندین پارامتر میگیره و در بعضی موارد این چندپارامتر بودنش مفید هستش
سلام درمورد، 19 یکم بیشتر توضیح میدید؟ 
و اگر اینکار رو نکنیم نفوذگر چجوری میتونه سوء استفاده کنه؟ چندتا keyword بدید خودم بیشتر درموردش سرچ کنم.
پاسخ:
سلام
برای اینکه هکر نتونه داخل فایلها توسط exploit اطلاعات مورد نظرش رو تزیق کنه
عالی!! نکتات گفته شده در کمترجایی پیدا می شه و بسیار حرفه ای و کاربردی است.
کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">