باگ csrf و روش های جلوگیری از حمله

224.png

حملات CSRF یا Cross Site Recuest Forgery

این حمله که به نوعی آنرا جزئی از باگ XSS می دانند تفاوت هایی داره و به نوعی با خلاف حملات xss عمل می کنه!

 

o703594_09560182947001820131.gif

باگ xss از اعتماد کاربر سو استفاده میکنه و کوکی کاربر رو می دزده ولی این باگ از اعتماد سایت سواستفاده میکنه و نفوذگر می تونه خودش رو جای کاربر اصلی معرفی کنه!

این حمله به نوعی به مراتب خطرناکتر از حملات xss است و تشخیص این حمله بسیار مشکل است! پس بهترین کار ایمن سازی است./

پس این حمله:

1- وب سایت رو قانع می کنه که کاربر اصلی است که کدهای مخرب رو به سایت می ده. چون وب سایت قابلیت این رو نداره که درک کنه این کاربر( هکر) کاربر اصلی نیست.

2- معمولا این حملات زمانی موفق است که وب سایت از نشست های ایمن جهت برقراری ارتباط استفاده می کنند.

3- این حملات از ارسال درخواست های جعلی HTTP نفوذگر اجرا می شوند. که هکر کاربران را مجاب می کند که درخواستش(درخواست مد نظر هکر توسط کاربر مجاز) را برای سرور ارسال کند.

در کل این حمله به این دلیل قدرتمند است که درخواست های جعلی یا http request های جعلی قابل شناسایی نیستند یا اگر باشند تشخیص بسیار سخت است. چرا که در خواست هایی که به روش GET ارسال میشوند به ظاهر فرقی با درخواست های دیگر ندارد و مرورگر بدون اطلاع از این موضوع درخواست را ارسال می کند!

روش های جلوگیری از حمله:

1- روش های رایج و معمول: در خیلی از مواقع تاکتیکی که خیلی از دوستان برنامه نویس برای جلوگیری از حمله انجام می دهند، تاکتیک چک کردن ورودی و تبدیل آن به کاراکتر های دیگه!

مثلا تبدیل کدهای ورودی به نوع int و گرفتن ورودی به صورت عددی... و یا اضافه کردن یک کاراکتر / به ورودی و...

کد زیر را در نظر داشته باشید:

<?php 
$q="select * from TABLE where id=".$_GET['id']; 
$q1=mysql_query($q); 
?>

روشهای معمول ایمن سازی به صورت زیر است:

1-استفاده از تابع int:
کد اصلاح شده با این متد:

<?php 
$id=(int)$_GET['id']; 
$q="select * from TABLE where id='".$id."'"; 
$q1=mysql_query($q); 
?>

2- اعتبار سنجی ورودی به وسیله تابع ctype_digit() که تقریبا کار بالا رو انجام میده:
کد اصلاح شده با این متد:

<?php 
$id=$_GET['id']; 
if(isset($id) AND ctype_digit($id)){ 
$q="select * from TABLE where id='".$id."'"; 
$q1=mysql_query($q); 

?>

3- استفاده از escape
کد اصلاح شده با این متد:

<?php 
$id=$_GET['id']; 
$q="select * from TABLE where id='".mysql_real_escape_string($id)."'"; 
$q1=mysql_query($q); 
?>

این کد تمامی ورودی های مضر را خنثی می کنه!
متد escape روش های دیگه هم داره که خیلی ایمن نیستند اما من بخاطر اینکه تاپیک جامع هست آنها را می آورم:
استفاده از تابع addslash , str_replace:

<?php 
$id=$_GET['id']; 
$q="select * from TABLE where id='".addslashes($id)."'"; 
$q1=mysql_query($q); 
?>

ین روش یک / به کد ورودی اضفه می کنه...

و برای str_replace:

<?php 
$id=$_GET['id']; 
$q="select * from TABLE where id='".str_replace("'","''",$id)."'"; 
$q1=mysql_query($q); 
?>

همانطور که می دانید این یک تابع تبدیل هست و آرگومنت اول را به آرگومنت دوم تبدیل می کنه...

 

پایان بخش اول

برچسب ها

ارسال نظر

نام
ایمیل (منتشر نمی‌شود) (لازم)
وبسایت
:) :( ;) :D ;)) :X :? :P :* =(( :O @};- :B /:) :S
نظر خصوصی
مشخصات شما ذخیره شود ؟ [حذف مشخصات] [شکلک ها]
کد امنیتی