• 1 رای - 3 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
CSRF Attacks
#1
خوب پيش از اينكه به جزئيات نحوه پيشگيري از حملات موسوم به 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"> در تمامي توابع نمايشي خود با فرض مهم بودن اطلاعات فرم كد زير را قرار دهيد
کد پی‌اچ‌پی:
<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
}
}
}

3.در تمامي صفحاتي كه يك كاربر Login كرده مي تواند به آنها دسترسي داشته باشد و شما نمي خواهيد حجوم اين حملات مورد بررسي قرار گيرد كد زير را پيش از تمامي include هاي فايلهاي Config مهم خود قرار دهيد.
کد پی‌اچ‌پی:
define("CSRF_PROTECTED"false); 

پ.ن ١: موارد ديگري مثل ست كردن زمان درخواست فرم و كنترل ارسال داده پس از مدت زمان مشخص بعد درخواست و برخي موارد ديگر به اين سيستم قابل تزريق مي‌باشد
پ.ن 2: اين مطالب متعلق به وبلاگ شخصي رامين فرماني به آدرس http://blog.farmani.ir و استفاده از اين مطالب تنها با ذكر نام وب سايت مجاز مي‌باشد
  پاسخ
تشکر شده توسط : Na3r oia zoghal molana admin scooter php HiddeN Muhammad-Ali
#2
سلام،
مرسی عزیز...
فقط اینکه متغیر $_USER['id'] در جایی تعریف شده یا خیر؟
در ضمن register_globals شما خاموش هستش یا روشن؟
وبلاگ: Yousha.Blog.ir

صدام: "اگر با ارتش شاه ایران طرف بودیم، یک ماهه جنگ را می بردیم"
http://gulfnews.com/opinion/thinkers/ira...i-1.500997
  پاسخ
تشکر شده توسط :
#3
كامنت ها در مورد متغيرها توضيح داده اند
register_globals در php 6 كاملا حذف شده و مدت هاست توصيه به off بودن آن مي شود
  پاسخ
تشکر شده توسط :
#4
نقل قول:كامنت ها در مورد متغيرها توضيح داده اند
register_globals در php 6 كاملا حذف شده و مدت هاست توصيه به off بودن آن مي شود
می دونم عزیز. منظورم متغیر $_USER هستش؟
register_globals شما رو هم گفتم. خاموشه یا روشن؟
تشکر.
وبلاگ: Yousha.Blog.ir

صدام: "اگر با ارتش شاه ایران طرف بودیم، یک ماهه جنگ را می بردیم"
http://gulfnews.com/opinion/thinkers/ira...i-1.500997
  پاسخ
تشکر شده توسط :
#5
(۱۳۸۸ خرداد ۲۲, ۰۳:۴۲ ب.ظ)Y.P.Y نوشته:
نقل قول:كامنت ها در مورد متغيرها توضيح داده اند
register_globals در php 6 كاملا حذف شده و مدت هاست توصيه به off بودن آن مي شود
می دونم عزیز. منظورم متغیر $_USER هستش؟
register_globals شما رو هم گفتم. خاموشه یا روشن؟
تشکر.
اي بابا ميگم متغير user توضيح داده شده صرفا براي بررسي لاگين بودن كاربره توضيحات من در مورد register_globals روشن بود كدها و آموزش جنبه آموزشي دارن حالا شما دنبال چي هستين من نمي دونم اگر اينها خلاف قوانين و مقررات بوده دستور بفرمائين خودم پست رو پاك كنم
  پاسخ
تشکر شده توسط : Na3r
#6
عزیز چرا ناراحت میشید؟
من فکر کردم نام $_USER جزو Predefined variable های PHP هستش که تا به حال ندیده بودم و واقاً تعجب کردم! چون عیناً شبیه به همون متغیر ها نوشته بودیدش. بدون تعریف از قبل... بعد هم که گفتم register_globals شما خاموشه یه روشن. به همین دلیه...
در هر صورت پوزش میخوام، منظوری نداشتم.
وبلاگ: Yousha.Blog.ir

صدام: "اگر با ارتش شاه ایران طرف بودیم، یک ماهه جنگ را می بردیم"
http://gulfnews.com/opinion/thinkers/ira...i-1.500997
  پاسخ
تشکر شده توسط :
#7
خوب قربون شكلت سوالي داري مثل بچه آدم سوالت رو بپرسTongue دليل اين عصبانيت هم شايد بچه هاي قديمي بدونن قبلا هم در پست هاي مشابه كساني اومدن به ايراد گرفتن كه هيچ اطلاعي تا قبل از پست من از موضوع نداشتن و هرچي هم بهشون مي گفتم به منوال مراجعه كنين برميگشتن چرند جواب مي دادن اينجا هم هي من مي گم تو كامنت جلوي متغير توضيح دادم شما هي برميگردي ميگي register_globals من چيه سعي كنين دقيقا سوالتون رو مطرح كنين و وقتي پاسخي داده ميشه دقيقا به راهنمائي داده شده رجوع كنين
  پاسخ
تشکر شده توسط : molana
#8
من یه سوال دارم
اگه rg در php 6 کاملا حذف میشه.پس تکلیف نرم افزارهایی که برای اجراش حتما باید rg روشن باشه چیه؟
یه سوال دیگه منظور از فایل پیکر بندی چیه؟.ini
اقای فرمانی همیشه از این کارا بکن امید ما جوونای بی تجربه به امثال شما پیرمردهای با تجربه ست!
  پاسخ
تشکر شده توسط : phpveteran
#9
(۱۳۸۸ خرداد ۲۴, ۰۷:۴۳ ب.ظ)scooter نوشته: من یه سوال دارم
اگه rg در php 6 کاملا حذف میشه.پس تکلیف نرم افزارهایی که برای اجراش حتما باید rg روشن باشه چیه؟
یه سوال دیگه منظور از فایل پیکر بندی چیه؟.ini
اقای فرمانی همیشه از این کارا بکن امید ما جوونای بی تجربه به امثال شما پیرمردهای با تجربه ست!

پيرمرد باباتهAngry من هنوز اول چلچليمهBlush ها خوب
مشكل اون نرم افزارهاست به اين مسئله ميگن backward compatibility كه به تدريج سعي ميشه حذف بشه تا مشكل تين تيپي پيش نياد در حقيقت مدتهاست كه توصيه اكيد به خاموش شدن اين كانفيگ ميشه
منظور همون php.ini هست ديگه
آهان تا يادم نرفته بزودي در مورد ديگر حملات مقاله خواهم نوشت كه قرار گرفتنشون در اينجا صرفا بستگي به استقبال كاربران اينجا داره
  پاسخ
تشکر شده توسط : scooter
#10
شما به ما لطف میکنی اگه مقالات بیشتری بنویسی
از جوابتون هم ممنون
اما ما در هاست های اشتراکی به فایل پیکر بندی دسترسی نداریم. چی کار کنیم؟
  پاسخ
تشکر شده توسط :


پرش به انجمن:


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