siavashsay
پنج شنبه 23 آذر 1391, 13:35 عصر
دوستان عزیز همین اول عرض کنم که این تاپیک هم جنبه سوالی داره واسم و هم آموزشی !
---------------
طبق تحقیقاتی که داشتم حملات CSRF یکی از حملاتی هست که هکرها مورد استفاده قرار میدن و نیازی به توضیح دادنشم نیست ! چون تو این فروم بهش اشاره شده !
اما قضیه اینجاس که موثرترین این حملات وقتی هست که ما بیشتر از متغیرهای GET استفاده میکنیم ! چون این متغیرها رو به راحتی میشه تو URL استفاده کرد!
یکی از راههای مفید استفاده از متغیرهای POST هست ! اما قضیه اینجاس که ما نمیگیم میشه کاملا به POST اکتفا کرد ! چرا که فرستادن متغیرهای POST هم روشی هست که هکرها میتونن ازش استفاده کنن !
حالا باز طبق همون تحقیقاتی که داشتم بهترین راه جلوگیری از حملات CSRF این هست که موقع ارسال یک درخواست ( مثل انجام یک تراکنش - فرستادن ایمیل - بروز کردن اطلاعات و ... ) از یک متغیر HIDDEN و یک SESSION استفاده کرد و اونا رو بصورت HASH RANDOM مقدار دهی کرد !
اینکار به خاطر این هست که ما چک کنیم که :
1- اون فرم توسط خود کاربر داره ارسال میشه
2- اون فرم یک بار ارسال میشه و برای هر بار ارسال مقدار جدید میگیره !
3- چک کنیم که اون درخواست و ارسال تنها توسط فرمی که توی سایت ما هست داره اجرا میشه ! نه اینکه مقادیر از سایت دیگری به سایت ما فرستاده شه !
--
حالا در مورد گزینه 3 بنده یه کدی رو نوشتم که میخوام توسط استاتید چک بشه و ببین که موثر هست یا خیر !
این کد :
if(isset($_POST['submit'])){
$serverUrl='http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$refererUrl=$_SERVER['HTTP_REFERER'];
if($serverUrl!=$refererUrl){
echo "ERROR";
}else{
echo "OK";
}
}
-- همونطور که واقفید این کد آدرس صفحه ای که فرم داخل اون هست و صفحه ای که متغیر ها از اونجا دارن ارسال میشن رو میگیره و چک میکنه که اگر متغیرها اگر از همون صفحه ارسال شدن OK و اگر از صفحه دیگه ای ارسال شدن مقدار ERROR رو بر میگردونه !
دوستان راهنمایی کنند :
--------
1- آیا به همین 1 راه میشه اکتفا کرد و اون حالت Hidden فیلد و Session رو در نظر نگرفت ؟! اگه نه - چرا ؟!
2- آیا این یک راه مکمل هست و اصلا نیازی هست استفاده شه یا خیر ؟!
3- اصلا نیازی نیست که استفاده شه ؟! چرا ؟!
--------
ممنون میشم راهنمایی کنید و اطلاعاتتون رو به اشتراک بگذارید !
با تشکر :)
---------------
طبق تحقیقاتی که داشتم حملات CSRF یکی از حملاتی هست که هکرها مورد استفاده قرار میدن و نیازی به توضیح دادنشم نیست ! چون تو این فروم بهش اشاره شده !
اما قضیه اینجاس که موثرترین این حملات وقتی هست که ما بیشتر از متغیرهای GET استفاده میکنیم ! چون این متغیرها رو به راحتی میشه تو URL استفاده کرد!
یکی از راههای مفید استفاده از متغیرهای POST هست ! اما قضیه اینجاس که ما نمیگیم میشه کاملا به POST اکتفا کرد ! چرا که فرستادن متغیرهای POST هم روشی هست که هکرها میتونن ازش استفاده کنن !
حالا باز طبق همون تحقیقاتی که داشتم بهترین راه جلوگیری از حملات CSRF این هست که موقع ارسال یک درخواست ( مثل انجام یک تراکنش - فرستادن ایمیل - بروز کردن اطلاعات و ... ) از یک متغیر HIDDEN و یک SESSION استفاده کرد و اونا رو بصورت HASH RANDOM مقدار دهی کرد !
اینکار به خاطر این هست که ما چک کنیم که :
1- اون فرم توسط خود کاربر داره ارسال میشه
2- اون فرم یک بار ارسال میشه و برای هر بار ارسال مقدار جدید میگیره !
3- چک کنیم که اون درخواست و ارسال تنها توسط فرمی که توی سایت ما هست داره اجرا میشه ! نه اینکه مقادیر از سایت دیگری به سایت ما فرستاده شه !
--
حالا در مورد گزینه 3 بنده یه کدی رو نوشتم که میخوام توسط استاتید چک بشه و ببین که موثر هست یا خیر !
این کد :
if(isset($_POST['submit'])){
$serverUrl='http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
$refererUrl=$_SERVER['HTTP_REFERER'];
if($serverUrl!=$refererUrl){
echo "ERROR";
}else{
echo "OK";
}
}
-- همونطور که واقفید این کد آدرس صفحه ای که فرم داخل اون هست و صفحه ای که متغیر ها از اونجا دارن ارسال میشن رو میگیره و چک میکنه که اگر متغیرها اگر از همون صفحه ارسال شدن OK و اگر از صفحه دیگه ای ارسال شدن مقدار ERROR رو بر میگردونه !
دوستان راهنمایی کنند :
--------
1- آیا به همین 1 راه میشه اکتفا کرد و اون حالت Hidden فیلد و Session رو در نظر نگرفت ؟! اگه نه - چرا ؟!
2- آیا این یک راه مکمل هست و اصلا نیازی هست استفاده شه یا خیر ؟!
3- اصلا نیازی نیست که استفاده شه ؟! چرا ؟!
--------
ممنون میشم راهنمایی کنید و اطلاعاتتون رو به اشتراک بگذارید !
با تشکر :)