X
تبلیغات
پیکوفایل
رایتل
پشم سنگ عایق الاستومری
چهارشنبه 5 مرداد‌ماه سال 1390
توسط: آلفا پک

روش هایی جهت افزایش ضریب امنیت در طراحی صفخات وب

مطمئناً اگر شما هم جزو یکی از کاربران متوسط اینترنت باشید حتماً کلمات sql injection به گوشتان خورده که به معنی تزریق کد های اس کیو ال وارد شدن بدون پسورد است .

فرض کنید شما برای گرفتن اطلاعات از پایگاه چنین کدی نوشته باشید:


select id,name from users

where name = '{0}' And pass = '{1}';


و اطلاعات را بدون هیچ کد اضافه ایی به صورت زیر در پایگاه ذخیره کرده باشید:


id     name       pass
1   | myname | 123456
2   | mynmae2| 1234
.
شما مقادیر {0}و{1}را مستقیم از یک تکست باکس دریافت و در کامند اس کیو ال جایگذاری می کنید حالا اگر کاربر یک نیم کت ' اضافه تایپ کند می تواند دستورات خود را بدون هیچ واسطه ایی رو دیتا بیس شما اعمال کند به صورت زیر

فرض کنید:


{0}=myname // user name can any thing
{1}=any' or 'a'='a  //sql injection code
حالا این مقادیر را در کامند بالا جای گذاری می کنیم تا ببینیم شکل دستورات به چه صورتی می شود
select id,name from users
where name = 'myname' And pass = 'any' or 'a'='a';

می بینیم که یک کامند ایجاد شد که عبارت
or 'a'='a'
همیشه درست است و دستور سلکت آیدی و نام تمام کاربران را بر می گرداند.

خوب این یک مثال ساده  بود.
حالا فرض کنید کاربر مورد نظر به طریقی می تواند اطلاعات بانک اطلاعاتی را روئیت کند خیلی ساده اطلاعات لازم برای ورود کاربران در اختیارش قرار می گیرد (برای نمونه ممکن است بک آپ بانک اطلاعاتی را به نحوی دانلود و مشاهده کند)
 حالا بخش  امنیت اطلاعات  و مقابله با این نوع کد ها و جلوگیری از حدس کلمه عبور
برای مقابله با این نوع حملات در php از تابع mysql_prep استفاده می شود که کارهای زیر را انجام می دهد
The code does the following:
1.Removes whitespace at the beginning and end of the string.
2.Replaces backslashes (\) with double backslash (\\).
3.Replaces single quotes (') with backslashed single quote (\').
4.Replaces percent signs (%) with backslashed percent signs (\%) to prevent wildcard errors with MySQL.
5.Removes all charactors that are not alpha-numeric, whitespace, or special charactors.

خوب این مرحله اول برای جلوگیری از حملات sql injection
مر حله دوم رمز گذاری پسورد است تا کسانی که به نحوی به پایگاه داده دسترسی دارند به طور مستقیم به پسورد دسترسی پیدا نکنند.
در مرحله رمز گذاری در php از توابعی شبیه md5 - sha1 -crc32 - hash استفاده می شود اما نکته اینجاست که این سرعت این توابع بسیار بالاست برای اینکه از کرک شدن پسورد رمز گذاری شده جلوگیری شود.
یک رشته به طول دلخواه به صورت راندم ایجاد می شود و مستقیم در پایگاه داده ذخیره می شود که به آن salt  گفته می شود و بعد این رشته هش یا رمزگذاری شده رشته پسورد از کاربر دریافت می شود و کل رشته جدید دوباره هش می شود.

می بینیم که رشته حاصل به هیچ وجه قابل کرک شدن نیست و باید حتما شخص رشته salt را بدست بیاورد تا امکان کرک کردن پسورد را پیدا کند.
شکل جدید پایگاه :
id      name       pass                                                  salt

1   | myname | 3769b1c4ba2fdb20d5ebe9849f3c48b4 | iPlodf
.
حالا وقتی کاربر بخواهد به حساب کاربری خود وارد شود ما بر اساس نام کاربری اطلاعات salt را که در هنگام ثبت نام به صورت تصادفی از کاربر گرفته بودیم را از پایگاه می خوانیم  و دوباره آنها را هش می کنیم و مقدار حاصل را دوباره مقدار هش شده قبلی مقایسه می کنیم اگر مطابقت کرد و تعداد سطر های دریافت شده از پایگاه دقیقاً برابر 1 بود
صحت کاربر تایید می شود .
مثال  اطلاعات زیر از کاربر در یافت می شود:
$name = myname;
$pass = 123456;
$salt = randomstr(6);// iPlodf
$hashed_pass = md5(md5($salt).md5($pass));//this password & name & salt save to db :=3769b1c4ba2fdb20d5ebe9849f3c48b4

  حال برای احراز هویت
select salt from users
where name = '{0}';//=$salt
 
و دوباره عمل هش نمودن پسوورد با پسوردی که الان کاربر در تکست باکس وارد کرده
و در آخر مقایسه :
select id,name from users
where name = '{$name}' and pass = '{$hashed_pass}'
.
.
.
if (mysql_num_rows($result_set) == 1) {
                // username/password authenticated
                // and only 1 match