يکی از افکار هر برنامه نويس، که روی سيستمی کار کرده که نياز به ثبت نام يا ورود به سيستم داشته هميشه اين بوده که آيا برنامه ای که مينويسه
امنيت کافی رو داره يا نه. (البته خيلی وقت ها هم برنامه نويس فکر ميکنه که آره ولی خلافش خيلی زود ثابت ميشه).
قبل از اينکه بخوايم به امنيت کامل يک سيستم فکر کنيم بايد بدونيم که هيچ سيستمی در مقابل اين 2 نکته امنيت نداره :
1. مهندسی اجتماعی
2. نفوز داخلی به يک سيستم ( مثلاً توسط يکی از کارمندا يا ...)
منظور از اين حرف اينه که هيچ کس نميتونه کاربر های يک سيستم رو کاملاً کنترل کنه.
مثلاً يک نمونه ميتونه انتخاب کردن پسورد های ساده توسط کاربر باشه يا اينکه پسوردش رو به کسی بده يا اينکه وارد سيستم بشه بعدش بره چای بياره و کامپيوتر رو بگزاره به امان خدا.
با اينکه اين جور حمله ها هميشه ميتونن وجود داشته باشن، ميشه با کمی فکر و حوصله خطر نفوذ رو به کمترين حالت ممکن رسوند.
چند قانون ساده ولی مهم:
1. هيچ سيستمی 100% امن نيست
2. سيستم رو هميشه به چند تيکه تقسيم کنيد که اگر به مشکلی برخورد کرديد کل سيستم به خطر نيفته
3. تا اونجا که ميتونيد اطلاعات سيستم رو ذخيره کنيد
4. هيچ وقت به کاربر اعتماد نکنيد.
روش های اوليه برای امن(تر) کردن يک سيستم:
1. نام کاربر و پسورد نبايد کمتر از 6 حرف باشه
2. در صورت اشتباه بودن ورودی(نام يا پسورد) کمترين اطلاعات رو به کاربر بديد
مثلاً خطا ميتونه به اين شکل باشه "ورود شما به سيستم موفقيت آميز نبود"، نه اينکه "پسورد شما کمتر از 6 حرف بود" يا "نام کاربری در سيستم مجود نيست". خلاصه اينکه هيچ وقت اطلاعات در مورد دليل خطا به کاربر نديد.
3. با خطا هايی که از سيستم ميگيريد درست برخورد کنيد.
يک راه ميتونه استفاده از (@) جلوی فانکش ها باشه. اين کار باعث ميشه که اگر سيستم با خطا مواجه شد خطا يی به کاربر نشون داده نشه.
مثلاً وقتی که گرفتن اطلاعات از داتابيس با خطا مواجه بشه خطا يی به browser فرستاده نمشه.
اينجور خطا ها به جز کمک به هکر کار ديگه ای نميکنن.
4. انکريپت کردن پسورد ها قبل از ذخيره در داتابيس مثلاً با استفاده از (sha-1)
هميشه اين هم در نظر داشته باشيد که يک هکر ممکنه بتونه به داتا بيس دسترسی پيدا کنه. در اين صورت اگه پسورد به صورت "clear text" ذخيره شده باشه که ...
البته انکريپت ساده هم خيلی جاها ديگه جواب گو نيست. مثلاً اگه فقط از md5 استفاده کنيد احتمال اينکه هش رو توی سايت های کرک پيدا کنيد خيلی بالاست.
واسه مقابله با اين مسئله هم چند راه وجود داره.
يکيش ميتونه انکريپت کردن چند باره باشه:
مثال:
کد php:
$encrypted = md5(md5($password));
و يا استفاده از چند روش با هم:
مثال:
کد php:
$encrypted = md5(sha1($password));
به نظر من مطمئن ترين راه (در حال حاضر) استفاده از salt در قفل گذاريه
مثال:
کد php:
$salt = 'random_12345';
$hash = md5 ($password . $salt);
واسه استفاده از salt هم ميتونيد يه سری به گوگل بزنيد
5. از استفاده از کلمات کليشه ای برای نام کاربری و پسورد جلوگيری کنيد.
مثلاً admin, root,god و ...
6. تعداد تمام لاگين های کاربر رو ثبت کنيد همينطور زمان و تاريخ آخرين لاگين
با اين کار ميشه اتفاقات افتاده شده توی سيستم رو پيگيری کرد. مثلاً اينکه هکر با چه اکانتی وارد سيستم شده و ...
7. فيلتر کردن کارکتر های غير قانونی ("illegal chars") در پست
فکر کنم ديگه همه اين مشکل رو ميشناسند. نمونه معروف اين مشکل "sql injection" باعث و بانی هک شدن خيلی سايت ها بوده و هنوز هم هست.
بحث به وجود اومدن اين باگ هم باشه واسه بعد ..
واسه جلوگيری از وارد کردن کد های مخرب ميشه از اين راه استفاده کرد
مثال:
کد php:
strip_tags(), str_replace() and stripslashes()
$login = @strip_tags($login);
$login = @stripslashes($login);
8. برای استيتمنت های SQL هميشه ليميت 1 بگزاريد
اين کار باعث ميشه که اگه کسی بتونه توی سيستم دستور SQL اجرا کنه بيشتر از 1 نتيجه رو نتونه بگيره.
مثال:
کد php:
select * from useraccount where login='$login' and password='$encrypted' limit 1
9. استفاده از "maxlenght" در فرم های HTML
مثلاً اگر نام کاربری يا پسورد در سيستم 6 حرفه، ورودی پست رو هم روی 6 بگزاريد.
10. هميشه مقدار ورودی رو چک کنيد
چون استفاده از maxlenght هميشه کافی نيست ميتونيد قبل از اجرای دستور مقدار ورودی رو دوباره چک کنيد
مثال: substr()
کد php:
$login = @substr($login, 0, 6);
11. چک کردن REFERRER
با چک کردن http_referer ميتونيد بفهميد که اطلاعات ورودی از server خودتون مياد يا از جای ديگه.
البته اينم گفته باشم که تغيير دادن http_referer کار اصلاً سختی نيست. ولی باز هم ميتونه خيلی وقتا جلو ی جوجه هکر ها و اسپمر ها رو بگيره
12. استفاده از $_POST به جای $_REQUEST
اگر در فرم HTML از POST برای فرستادن اطلاعات به اسکريپت استفاده ميکنيد، در اسکريپت هم حتماً از $_POST برای گرفتن اطلاعات استفاده کنيد و نه از $_REQUEST.
چون با استفاده از GET در URL ميشه خيلی راحت اطلاعات رو گرفت.
برای دور زدن اين هم راه زياده، ولی باز هم ميشه جلو خيلی از جوجه ها رو گرفت.
13. استفاده از SSL
در حد امکان از SSL استفاده کنيد تا اطلاعات بين server و کاربر مستقيم ردوبدل بشه.
14. طبقه بندی کاربر ها
به کاربر ها فقط دسترسی هايی رو بديد که لازم داره. نه کمتر و نه بيشتر
14. طبقه بندی کاربر ها
به کاربر ها فقط دسترسی هايی رو بديد که لازم داره. نه کمتر و نه بيشتر
اين از قسمت اول
قسمت دوم هم ميشه موارد پيشرفته تر
آخرش هم يه اسکريپت واسه لاگين مينويسيم که نشه راحت دورش زد
منبع هم خيلی زياد داره سخته بخوام همه رو بنويسم ولی اصل کاری کتاب •Security Engineering - ISBN 0471389226