۱۳۸۷/۱۱/۰۲

Anti CSRF module for ASP.NET


CSRF يا Cross Site Request Forgery به صورت خلاصه به اين معنا است كه شخص مهاجم اعمالي را توسط شما و با سطح دسترسي شما بر روي سايت انجام دهد و اطلاعات مورد نظر خود را استخراج كرده (محتويات كوكي يا سشن و امثال آن) و به هر سايتي كه تمايل دارد ارسال كند. اين‌كار عموما با تزريق كد در صفحه صورت مي‌گيرد. مثلا ارسال تصويري پويا به شكل زير در يك صفحه فوروم، بلاگ يا ايميل:

<img src="http://www.example.com/logout.aspx">

شخصي كه اين صفحه را مشاهده مي‌كند، متوجه وجود هيچگونه مشكلي نخواهد شد و مرورگر حداكثر جاي خالي تصوير را به او نمايش مي‌دهد. اما كدي با سطح دسترسي شخص بازديد كننده بر روي سايت اجرا خواهد شد.

روش‌هاي مقابله:
  • هر زمانيكه كار شما با يك سايت حساس به پايان رسيد، log off كنيد. به اين صورت بجاي منتظر شدن جهت به پايان رسيدن خودكار طول سشن، سشن را زودتر خاتمه داده‌ايد يا برنامه نويس‌ها نيز بايد طول مدت مجاز سشن در برنامه‌هاي حساس را كاهش دهند. شايد بپرسيد اين مورد چه اهميتي دارد؟ مرورگري كه امكان اجازه‌ي بازكردن چندين سايت با هم را به شما در tab هاي مختلف مي‌دهد، ممكن است سشن يك سايت را در برگه‌اي ديگر به سايت مهاجم ارسال كند. بنابراين زمانيكه به يك سايت حساس لاگين كرده‌ايد، سايت‌هاي ديگر را مرور نكنيد. البته مرورگرهاي جديد مقاوم به اين مسايل شده‌اند ولي جانب احتياط را بايد رعايت كرد.
براي نمونه افزونه‌اي مخصوص فايرفاكس جهت مقابله با اين منظور در آدرس زير قابل دريافت است:

  • در برنامه خود قسمت Referrer header را بررسي كنيد. آيا متد POST رسيده، از سايت شما صادر شده است يا اينكه صفحه‌اي ديگر در سايتي ديگر جعل شده و به برنامه شما ارسال شده است؟ هر چند اين روش آنچنان قوي نيست و فايروال‌هاي جديد يا حتي بعضي از مرورگرها با افزونه‌هايي ويژه، امكان عدم ارسال اين قسمت از header درخواست را ميسر مي‌سازند.
  • برنامه نويس‌ها نبايد مقادير حساس را از طريق GET requests ارسال كنند. استفاده از روش POST نيز به تنهايي كارآمد نيست و آن‌را بايد با random tokens تركيب كرد تا امكان جعل درخواست منتفي شود. براي مثال استفاده از ViewStateUserKey در ASP.Net . جهت خودكار سازي اعمال اين موارد در ASP.Net، اخيرا HTTP ماژول زير ارائه شده است:

تنها كافي است كه فايل dll آن در دايركتوري bin پروژه شما قرار گيرد و در وب كانفيگ برنامه ارجاعي به اين ماژول را لحاظ نمائيد.

كاري كه اين نوع ماژول‌ها انجام مي‌دهند افزودن نشانه‌هايي اتفاقي ( random tokens ) به صفحه‌ است كه مرورگر آن‌ها را بخاطر نمي‌سپارد و اين token به ازاي هر سشن و صفحه منحصر بفرد خواهد بود.

براي PHP‌ نيز چنين تلاش‌هايي صورت گرفته است:
http://csrf.htmlpurifier.org/


مراجعي براي مطالعه بيشتر
Prevent Cross-Site Request Forgery (CSRF) using ASP.NET MVC’s AntiForgeryToken() helper
Cross-site request forgery
Top 10 2007-Cross Site Request Forgery
CSRF - An underestimated attack method