امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
لاگين و امنيت در PHP (قسمت اول)
نویسنده پیام
PouriaAmid آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 272
موضوع‌ها: 15
تاریخ عضویت: شهریور ۱۳۸۳

تشکرها : 34
( 311 تشکر در 133 ارسال )
ارسال: #1
لاگين و امنيت در PHP (قسمت اول)
يکی از افکار هر برنامه نويس، که روی سيستمی کار کرده که نياز به ثبت نام يا ورود به سيستم داشته هميشه اين بوده که آيا برنامه ای که مينويسه
امنيت کافی رو داره يا نه. (البته خيلی وقت ها هم برنامه نويس فکر ميکنه که آره ولی خلافش خيلی زود ثابت ميشه).
قبل از اينکه بخوايم به امنيت کامل يک سيستم فکر کنيم بايد بدونيم که هيچ سيستمی در مقابل اين 2 نکته امنيت نداره :
1. مهندسی اجتماعی
2. نفوز داخلی به يک سيستم ( مثلاً توسط يکی از کارمندا يا ...)

منظور از اين حرف اينه که هيچ کس نميتونه کاربر های يک سيستم رو کاملاً کنترل کنه.
مثلاً يک نمونه ميتونه انتخاب کردن پسورد های ساده توسط کاربر باشه يا اينکه پسوردش رو به کسی بده يا اينکه وارد سيستم بشه بعدش بره چای بياره و کامپيوتر رو بگزاره به امان خدا.Whistle
با اينکه اين جور حمله ها هميشه ميتونن وجود داشته باشن، ميشه با کمی فکر و حوصله خطر نفوذ رو به کمترين حالت ممکن رسوند.

چند قانون ساده ولی مهم:
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($login06); 

11. چک کردن REFERRER
با چک کردن http_referer ميتونيد بفهميد که اطلاعات ورودی از server خودتون مياد يا از جای ديگه.
البته اينم گفته باشم که تغيير دادن http_referer کار اصلاً سختی نيست. ولی باز هم ميتونه خيلی وقتا جلو ی جوجه هکر ها و اسپمر ها رو بگيره

12. استفاده از $_POST به جای $_REQUEST
اگر در فرم HTML از POST برای فرستادن اطلاعات به اسکريپت استفاده ميکنيد، در اسکريپت هم حتماً از $_POST برای گرفتن اطلاعات استفاده کنيد و نه از $_REQUEST.
چون با استفاده از GET در URL ميشه خيلی راحت اطلاعات رو گرفت.
برای دور زدن اين هم راه زياده، ولی باز هم ميشه جلو خيلی از جوجه ها رو گرفت.

13. استفاده از SSL
در حد امکان از SSL استفاده کنيد تا اطلاعات بين server و کاربر مستقيم ردوبدل بشه.

14. طبقه بندی کاربر ها
به کاربر ها فقط دسترسی هايی رو بديد که لازم داره. نه کمتر و نه بيشتر


14. طبقه بندی کاربر ها
به کاربر ها فقط دسترسی هايی رو بديد که لازم داره. نه کمتر و نه بيشتر

اين از قسمت اول Whistle
قسمت دوم هم ميشه موارد پيشرفته تر
آخرش هم يه اسکريپت واسه لاگين مينويسيم که نشه راحت دورش زد Happy


منبع هم خيلی زياد داره سخته بخوام همه رو بنويسم ولی اصل کاری کتاب •Security Engineering - ISBN 0471389226

Root is not accessible
۲۰-آبان-۱۳۸۹, ۱۶:۰۱:۰۶
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : babyy, CRazYFULL, Di Di, ha_60, Majid_Ebru
mohamadpk آفلاین
در حال پیشرفت
***

ارسال‌ها: 337
موضوع‌ها: 39
تاریخ عضویت: اردیبهشت ۱۳۸۷

تشکرها : 726
( 661 تشکر در 257 ارسال )
ارسال: #2
RE: لاگين و امنيت در PHP (قسمت اول)
نمی دونم جای گفتنش اینجاست یا نه . اگر نبود آقای PouriaAmid خودتون این پست رو پاک کنید.بهتره دوستانی که تازه می خوان php شروع کنن. از برنامه نویسی سنتی دست بردارن. یه سری به قسمت oop در سایت php بزنن. بعد از چند هفته تمرین در oop. برن یه frame work رو انتخاب کنن. چون هم سرعت کد زدنشون بالا میره. هم حجم کد هایی که میزنن کم میشه. هم امنیت رو با کمترین کد می تونن بر قرار کنن. پیشنهاد من هم zend هست.چون من با چند تا framework کار کردم. مثل cake اما بهترین zend بود.

مثلا تو همین زمینه
نقل قول: 14. طبقه بندی کاربر ها
به کاربر ها فقط دسترسی هايی رو بديد که لازم داره. نه کمتر و نه بيشتر
تو zend خیلی راحت با Application_Plugin_Acl میشه انجامش داد. به هر فولدر یا فایلی میشه سطح دسترسی رو تعریف کرد.

البته حرف های مدیر محترم رو نمیشه نا دیده گرفت و گفت حرف های ایشون به درد نمی خوره یا از این حرف ها. چون اگر دانش php شما در زمینه امنیت بالا باشه . وقتی یه مشگل یا کمبودی رو تو یه framework احساس میکنید. بدون نگرانی کد framework رو edit می کنید یا ازافه یا کم می کنید و نگران این نخواهید بود که تغیرات شما باعث ایجاد باگ یا ضعف امنیتی بشه.


یه چیزی هم ازافه کنم. فقط به ورودی هاتون که از توی textbox یا هر جعبه ورودی دیگه می گیرید کار نکنید. parametr هایی که از url هاتون می گیرید خیلی مهم هستند. اما در کل هر داده ای که از طرف کاربر میاد رو یه حمله حساب کنید. مثلا کوکی از همین کوکی میشه به راحتی به یه سایت آسیب پذیر حمله sql injection کرد.

یعنی حتی به کوکی هم اعتماد نکنید. همین.
آقای PouriaAmid ببخشید که دخالت کردم . فقط فکر می کردم باید این هارو بگم. همین. خسته نباشید و ممنون.

وطنم ای عشق همیشگی من ایران زمین

شقایق ها گل میکنن دوباره عاشق میشن...........قصه عشق وطن رو به غنچه هاشون میگن


۲۰-آبان-۱۳۸۹, ۲۱:۵۳:۱۷
ارسال‌ها
پاسخ
PouriaAmid آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 272
موضوع‌ها: 15
تاریخ عضویت: شهریور ۱۳۸۳

تشکرها : 34
( 311 تشکر در 133 ارسال )
ارسال: #3
RE: لاگين و امنيت در PHP (قسمت اول)
حرف شما رو تا قسمتی قبول دارم دوست عزيز.
100% خيلی راه ها هستش، که يکيش استفاده از فريمورک هستش.
هدف من از نوشتن اين مطالب چيز ديگی ای بود. اگه يه برنامه نويس بتونه با امکانات اوليه اين مشکلات رو برطرف کنه نشون دهنده اينه که اصل مطلب رو فهميده.
حالا تو قدم های بعدی ميشه از خيلی موارد کمکی هم استفاده کرد.
قصد من فقط ريشه های اين بحثه که با چند تا پست توی forum هم تموم نميشه، ولی شروع کردنش بهتر از هيچيه
حالا اين وسط خودم هم يه چيزی بيشتر ياد ميگيرم

Root is not accessible
۲۰-آبان-۱۳۸۹, ۲۲:۴۰:۰۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : mohamadpk, Di Di


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
Smile ذخیره تصاویر در MySQL و نمایش آنها با PHP قسمت اول P.H.P 2 14,890 ۱۰-شهریور-۱۳۹۰, ۱۸:۳۶:۳۱
آخرین ارسال: Y.P.Y
Toungue ذخیره تصاویر در MySQL و نمایش آنها با PHP قسمت دوم P.H.P 0 4,498 ۱۶-شهریور-۱۳۸۹, ۱۶:۱۵:۴۹
آخرین ارسال: P.H.P
  قسمت دوم آموزش PHP arashrj 0 1,842 ۱۴-اسفند-۱۳۸۵, ۰۱:۲۴:۵۴
آخرین ارسال: arashrj
  قسمت اول آموزش PHP arashrj 3 2,450 ۱۴-اسفند-۱۳۸۵, ۰۱:۲۰:۴۹
آخرین ارسال: arashrj

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS