۱۳۸۸ خرداد ۲۱, ۱۱:۴۰ ب.ظ
خوب پيش از اينكه به جزئيات نحوه پيشگيري از حملات موسوم به CSRF بپردازيم اجازه بدين كمي اين نوع حملات رو براتون توضيح بدم.
Cross Site Request Forgery كه به نامهاي ديگري چون (XSRF, CSRF (Cross Site Reference Forgery شهرت داره كه از اعتماد سايتها نسبت به كاربرانشان براي حملات خود سوءاستفاده ميكند. انجام امور گوناگون سايتها عموماً در URL آنها تعريف مي شود بطور مثال آدرس http://site/stocks?buy=100&stock=ebay كار بخصوصي را زمان اعمال درخواست انجام ميدهد. زماني كه يك كاربر در سايتي Login كند و يك نفوذگر توسط مرورگر كاربر يك درخواست عملياتي مشابه مثال بالا ارسال كند، درخواست اجرا شده و به عنوان يك درخواست اين كاربر تعمه ذخيره مي شود. اين كار توسط كدهاي مخرب HTML يا جاوااسكريپت در ايميل يا داخل سايتي ديگر بصورت مخفي و بدون آگاهي كاربر قابل انجام است و كافيست كه كاربر همزمان دو پنجره را باز كرده باشد كه اين روزها امري كاملاً مرسوم است. اينگونه تزريقات درلابلاي زبانهاي نشانه گذاري سبك مثل BBCode و... نيز كاملا شدني است كه اين نيز به نوبه خود به هرچه
خطرناكتر شدن اين حملات كمك ميكند. اين نوع حملات در حين پردازش فرمها نيز اتفاق مي افتد كافيست تا حمله كننده نام مشابهي براي input هاي خود استفاده كرده و حتي توسط جاوااسكريپت بدون آگاهي كاربر بصورت auto-submit فرم ها را ارسال كند.
در طي اين آموزش نحوه نوشتن و پاك كردن يك فرم پيش از پست آن آموزش داده ميشود:
در ابتدا پيشنهاد ميشود بجاي استفاده از GET در مورد اطلاعات مهم از متد POST استفاده كنيد و براي بررسي داده ها بجاي استفاده از REQUEST از POST استفاده كنيد ديگر آنكه مبناي تئوريك اين حمله ارسال اطلاعات جعلي توسط مقادير يك فرم است بنابراين اگر كاربري فرمي را بفرستد كه قبلا براي آن درخواستي نفرستاده مي توان به آن مشكوك شد. بنابراين:
1. پس از هر <form method="POST"> در تمامي توابع نمايشي خود با فرض مهم بودن اطلاعات فرم كد زير را قرار دهيد
2. كد زير را در فايل پيكربندي خود قرار دهيد
3.در تمامي صفحاتي كه يك كاربر Login كرده مي تواند به آنها دسترسي داشته باشد و شما نمي خواهيد حجوم اين حملات مورد بررسي قرار گيرد كد زير را پيش از تمامي include هاي فايلهاي Config مهم خود قرار دهيد.
پ.ن ١: موارد ديگري مثل ست كردن زمان درخواست فرم و كنترل ارسال داده پس از مدت زمان مشخص بعد درخواست و برخي موارد ديگر به اين سيستم قابل تزريق ميباشد
پ.ن 2: اين مطالب متعلق به وبلاگ شخصي رامين فرماني به آدرس http://blog.farmani.ir و استفاده از اين مطالب تنها با ذكر نام وب سايت مجاز ميباشد
Cross Site Request Forgery كه به نامهاي ديگري چون (XSRF, CSRF (Cross Site Reference Forgery شهرت داره كه از اعتماد سايتها نسبت به كاربرانشان براي حملات خود سوءاستفاده ميكند. انجام امور گوناگون سايتها عموماً در URL آنها تعريف مي شود بطور مثال آدرس http://site/stocks?buy=100&stock=ebay كار بخصوصي را زمان اعمال درخواست انجام ميدهد. زماني كه يك كاربر در سايتي Login كند و يك نفوذگر توسط مرورگر كاربر يك درخواست عملياتي مشابه مثال بالا ارسال كند، درخواست اجرا شده و به عنوان يك درخواست اين كاربر تعمه ذخيره مي شود. اين كار توسط كدهاي مخرب HTML يا جاوااسكريپت در ايميل يا داخل سايتي ديگر بصورت مخفي و بدون آگاهي كاربر قابل انجام است و كافيست كه كاربر همزمان دو پنجره را باز كرده باشد كه اين روزها امري كاملاً مرسوم است. اينگونه تزريقات درلابلاي زبانهاي نشانه گذاري سبك مثل BBCode و... نيز كاملا شدني است كه اين نيز به نوبه خود به هرچه
خطرناكتر شدن اين حملات كمك ميكند. اين نوع حملات در حين پردازش فرمها نيز اتفاق مي افتد كافيست تا حمله كننده نام مشابهي براي input هاي خود استفاده كرده و حتي توسط جاوااسكريپت بدون آگاهي كاربر بصورت auto-submit فرم ها را ارسال كند.
در طي اين آموزش نحوه نوشتن و پاك كردن يك فرم پيش از پست آن آموزش داده ميشود:
در ابتدا پيشنهاد ميشود بجاي استفاده از GET در مورد اطلاعات مهم از متد POST استفاده كنيد و براي بررسي داده ها بجاي استفاده از REQUEST از POST استفاده كنيد ديگر آنكه مبناي تئوريك اين حمله ارسال اطلاعات جعلي توسط مقادير يك فرم است بنابراين اگر كاربري فرمي را بفرستد كه قبلا براي آن درخواستي نفرستاده مي توان به آن مشكوك شد. بنابراين:
1. پس از هر <form method="POST"> در تمامي توابع نمايشي خود با فرض مهم بودن اطلاعات فرم كد زير را قرار دهيد
کد پیاچپی:
<input type="hidden" name="token" value="<?echo ($_SESSION['token'])" />
2. كد زير را در فايل پيكربندي خود قرار دهيد
کد پیاچپی:
if (isset($_USER['id'])) { // your function to check if a user is logged in
if (empty($_SESSION['token']) || !isset($_SESSION['token'])) { // if there is no token set
$_SESSION['token'] = strrev(md5($_USER['password'])); //set a token with a reverse string and md5 encryption of the user's
password
}
if (CSRF_PROTECTED != false) { // if you did not define CSRF_PROTECTED as false
if ($_POST) { // if there is a form present
if ($_POST['token'] != $_SESSION['token']) { // if the input token does not equal the session token
header("Location: /index.php"); // redirect to index
die(); // stops all $_POST data from being sent
}
}
}
}
کد پیاچپی:
define("CSRF_PROTECTED", false);
پ.ن ١: موارد ديگري مثل ست كردن زمان درخواست فرم و كنترل ارسال داده پس از مدت زمان مشخص بعد درخواست و برخي موارد ديگر به اين سيستم قابل تزريق ميباشد
پ.ن 2: اين مطالب متعلق به وبلاگ شخصي رامين فرماني به آدرس http://blog.farmani.ir و استفاده از اين مطالب تنها با ذكر نام وب سايت مجاز ميباشد