csrf

چرا لاراول بهترین فریمورک PHP برای توسعه وب است؟

چرا لاراول به عنوان بهترین فریمورک PHP شناخته می شود؟ لاراول یک فریمورک جوان با آینده ی فوق العاده هست. چرا که قابلیت توسعه ی سریع و امن اپلیکیشن های مدرن را به خوبی دارد. Taylor Otwell لاراول را در سال 2011 به دنیا معرفی کرد. از این رو این فریمورک رویکردی مدرن دارد و از ابتدا با ساختار MVC (مدل, View و کنترلر) ساخته شد, همچنین تقریبا تمام چیزهایی که باید داشته باشد مثل مدیر رویداد و احراز هویت کاربر پشتیبانی می کند. لاراول از مدیر دیتابیس به خوبی پشتیبانی میکند و بوسیله ی مدیریت پکیج هایش کد ماژولار و قابل گسترشی دارد.

یکی از نکات مهم در بحث امنیت، حفاظت CSRF در لاراول می‌باشد که از وب اپلیکیشن‌ها در برابر حملات Cross-Site Request Forgery محافظت می‌کند. شناخت این نوع از حملات و راه‌های مقابله با آن‌ها یکی از موارد مهمی است که هر برنامه نویس لاراول باید از آن آگاهی داشته باشد.

اگر برنامه نویس لاراول هستید و یا دارای وب سایت می‌باشید و نمی‌خواهید وب سایت شما با حمله CSRF در لاراول آسیب ببیند، تا انتهای این مقاله با ما همراه باشید.

حمله CSRF چیست؟

CSRF مخفف Cross-Site Request Forgery می‌باشد که به معنای جعل درخواست از طریق سایت است.حملات CSRF فعالیت های غیر مجازی است که کاربرانِ معتبرِ سیستم (authenticated users) انجام می دهند.به همین ترتیب، بسیاری از برنامه های کاربردی وب، مستعد ابتلا به این حملات هستند.

CSRF یک حفره امنیتی در وب است که به مهاجم اجازه می‌دهد تا کاربران را وادار به انجام کارهایی کند که قصد انجام آن‌ها را ندارند. این حمله به مهاجم این اختیار را می‌دهد تا سیاست‌هایی که برای جلوگیری از دخالت وب سایت‌های مختلف در کار یکدیگر طراحی شده‌اند را دور بزند. به عنوان مثال فرض کنید، کاربران سایت google.com با وارد کردن آدرس google.com/logout کوکی مرورگرشان حذف می‌شود و در نتیجه logout می‌شوند. حال اگر یکی از کاربران در یک سایت دیگر (مثلاً در یک انجمن شلوغ) تصویری با تگ img زیر ارسال کند و افراد دیگر حاضر در آن انجمن این تصویر را مشاهده کنند، از طرف مرورگرشان درخواستی به سایت گوگل ارسال می‌شود و موجب می‌شود تا همه کسانی که آن تصویر را دیده‌اند از اکانت گوگل‌شان بیرون انداخته شوند.

<img src="https://www.google.com/logout/" alt="" />

Laravel، محافظت دربرابر CSRF را به روش زیر ارائه می دهد:

Laravel شامل یک plugin یا افزونه CSRF ساخته شده است که برای هر session فعالِ کاربر، نشانه یا token ایجاد می کند. این tokenها تأیید می کنند که عملیات یا درخواست ها توسط کاربرِ معتبر (authenticated user) ارسال شده اند یا خیر.

CSRF چگونه کار می‌کند؟

CSRF باعث می‌شود برنامه‌های وب نتوانند بین درخواست‌های معتبر و درخواست‌های جعلی کنترل شده توسط مهاجم تمایز قائل شوند. روش‌های زیادی وجود دارد که یک مهاجم سعی می‌کند از حفره امنیتی CSRF استفاده کند. در ادامه برای درک بهتر این نوع حملات، با ذکر یک مثال به توصیف چگونگی حملات CSRF در لاراول می‌پردازیم.

فرض کنید، شخصی به نام باب یک حساب بانکی آنلاین در سایت samplebank.com دارد. او مرتباً برای انجام معاملات خود از این سایت بازدید می‌کند. باب اطلاعی ندارد که samplebank.com در برابر حملات CSRF آسیب پذیر است. در همین حال یک مهاجم قصد دارد با استفاده از این حفره‌ی امنیتی 5000 دلار از حساب باب به حساب دیگر منتقل کند.

برای انجام موفقیت آمیز این حمله:

  • مهاجم باید یک URL بهره‌برداری ایجاد کند.
  • مهاجم باید باب را فریب دهد تا روی URL بهره‌برداری کلیک کند.
  • برای لاگین کردن و کار با حساب، باب نیاز به یک session فعال در سایت samplebank.com دارد.

در ادامه، باب برای انتقال پول در سایت بانک، یک درخواست با روش GET ارسال می‌کند. به این ترتیب درخواست انتقال ۵۰۰ دلار به حساب دیگر (با شماره حساب ۲۱۳۳۶۷ ) ممکن است به شکل زیر باشد:

GET https://samplebank.com/onlinebanking/transfer?amount=500&accountNumber=213367 

همانطور که قبلا گفتیم، یک مهاجم برای انجام موفق حمله CSRF باید یک url مخرب ایجاد کند تا ۵۰۰۰ دلار به حساب ۴۲۵۶۵۴ منتقل کند.

https://samplebank.com/onlinebanking/transfer?amount=5000&accountNumber=425654

حالتی را در نظر بگیرید که در آن از تگ img استفاده می‌شود. در این حالت، مهاجم ایمیلی حاوی یک تصویر به باب ارسال می‌کند. برنامه‌ی مرورگر باب با دریافت آن، url موجود در تگ img را به صورت خودکار باز می‌کند. در نتیجه بدون دخالت باب، درخواست ناخواسته به سایت بانک ارسال می‌شود. اگر باب در سایت samplebank.com یک session فعال داشته باشد. سایت، این url را به عنوان درخواست انتقال پول از طرف باب شناسایی می‌کند و سپس مبلغ مورد نظر به حساب مشخص شده توسط مهاجم منتقل می‌شود.

البته توجه داشته باشید که برای انجام موفق حمله CSRF برخی محدودیت‌ها وجود دارد. از جمله:

  • این حمله تنها در صورتی موفقیت آمیز خواهد بود که کاربر دارای یک session فعال در یک وب سایت آسیب پذیر باشد.
  • مهاجم باید یک url معتبر پیدا کند تا با سوءنیت آن را دستکاری کند. url مورد نظر لازم است باعث تغییر وضعیت در سایت هدف شود.
  • در آخر مهاجم باید مقادیر مناسب پارامترهای url را پیدا کند. در غیر این صورت وب سایت هدف ممکن است درخواست مخرب را رد کند.

پیاده سازی

پیاده سازی حفاظت CSRF در Laravel در این بخش به طور دقیق مورد بحث قرار می گیرد.

■ CSRF در فرم های HTML به کار برده شده در برنامه های وب ، پیاده سازی می شوند. شما هر زمانی که یک فرم html در برنامه خود تعریف می کنید، باید یک فیلدِ پنهان (hidden validated CSRF token) در فرم قراربدهید تا middleware مربوط به حفاظت CSRF بتواند درخواست کاربر را اعتبارسنجی کند.

کد زیر موید این مطلب است.

<form method = "POST" action="/profile">

   {{ csrf_field() }}

   ...

</form>

■ در هنگام ایجاد برنامه های JavaScript ، کتابخانه های HTTP جاوا اسکریپت ، برای هر درخواست خروجی، token حفاظت CSRF را پیوست می نماید.

■ فایلی که resources/assets/js/bootstrap.js نام دارد بطورپیشفرض، مقدار تگ های متا csrf-token را با کتابخانه Axios HTTP  ذخیره می کند.

فرم بدون CSRF token

قطعه کدهای زیر را در نظر بگیرید.

ان کد ، یک form را نشان می دهد، که دو پارامتر input می گیرد: email و message.

<form>
   <label> Email </label>
      <input type = "text" name = "email"/>
      <br/>
   <label> Message </label> <input type="text" name = "message"/>
   <input type = ”submit” name = ”submitButton” value = ”submit”>
</form>

نتیجه کد بالا را در تصویر زیر می توانید مشاهده کنید:

فرم نشان داده شده در بالا، هر اطلاعاتِ ورودی، از یک کاربرِ مجاز (authorized user) را می پذیرد. این ممکن است، برنامه وب را مستعد حملات مختلف کند. لطفا توجه داشته باشید که دکمه ارسال (submit button) شامل تابع یا functionی در بخش controller است.

تابع postContact در controller برای نمایش تمام request ها استفاده می شود.

public function postContact(Request $request){
   return $request-> all();
}

توجه داشته باشید که این فرم هیچ token یا نشانه CSRF را شامل نمی شود، بنابراین اطلاعات حساس به اشتراک گذاشته شده، مانند پارامترهای ورودی ، مستعد ابتلا به حملات مختلف هستند.

فرم با CSRF token

همانطور که در کدهای زیر می بینید فرم را دوباره طراحی کردیم ولی این بار با استفاده از csrf-token .

<form method = ”post” >
   {{ csrf_field() }}
   <label> Email </label>
   <input type = "text" name = "email"/>
   <br/>
   <label> Message </label>
   <input type = "text" name = "message"/>
   <input type = ”submit” name = ”submitButton” value = ”submit”>
</form>

خروجی به دست آمده JSON را با یک token به صورت زیر نشان می دهد

{
   "token": "ghfleifxDSUYEW9WE67877CXNVFJKL",
   "name": "TutorialsPoint",
   "email": "contact@tutorialspoint.com"
}

این نشانه CSRF-Token ایجاد شده در کلیک روی دکمه  submit button است.

چرا باید از قابلیت‌ CSRF Protection در لاراول استفاده کنیم؟

در این مقاله تلاش شد تا به طور کامل به توصیف حملات CSRF، چگونگی کارکرد آن‌ها و روش‌های جلوگیری از این‌گونه آسیب‌ها بپردازیم. توجه داشته باشید که این حفره‌ی امنیتی یکی از آسیب‌های جدی وب سایت است که در صورت رعایت نکردن موارد امنیتی می‌تواند بسیار خطرناک باشد و یک کسب و کار را یک شبه از بین ببرد. چنانچه از لاراول استفاده می‌کنید، می‌توانید به سادگی با استفاده از قابلیت‌ CSRF Protection در لاراول از این‌گونه حملات جلوگیری کنید.

دیدگاهتان را بنویسید