یکی از این مباحث، موضوع بسیار مهمی در زمینه امنیت تحت عنوان جلوگیری از حملات Cross-Site Request Forgery یا به اختصار CSRF هست. این نوع حمله یکی از آسیبپذیریهای رایج در حوزه وب هست. در این نوع حمله، فرض بر این هست که کاربر ازطریق یک سایت قانونی واردشده. بعد این کاربر سایت هکر رو بازدید میکنه درخواستهایی رو به سایت اصلی ازطریق جاوااسکریپت، فرم، تگ <img src=" یا هر روش دیگه، ارسال میکنه. در این روش، نفوذگر میتونه بعنوان مثال رمز کاربر رو Reset کنه یا پول رو از حساب بانکی کاربر جابجا کنه (البته اگه سایت بانک امنیت نداشته باشه).
یکی از راههای جلوگیری از این نوع حملات، استفاده از یک شناسه (توکن) خاص برای اعتبارسنجی منبع درخواستهاست. Yii بطور پیشفرض این قابلیت رو داره. میتونید اون رو با ساخت یک فرم ساده و ارسالش تست کنید:
<form method="POST">
<input type="submit" value="ok!">
</form>
نقل قول:
Bad Request (#400)
Unable to verify your data submission.
علت این خطا اینه که توی هر درخواست، Yii یک شناسه خاص غیرتکراری تحت عنوان توکن میسازه که شما باید اون رو همراه دادههای درخواستتون بفرستین. بنابراین وقتی یه درخواست ارسال میکنید، Yii شناسه ارسالشده و تولیدشده رو با هم مقایسه میکنه. اگه با هم یکی باشن Yii به بررسی درخواست ادامه میده وگرنه خطای فوق تولید خواهد شد.
توکن تولیدشده، در درسترس سایت نفوذگر نیست و درنتیجه نمیتونه همراه درخواستهاش بفرسته.
یک نکته مهم اینه که چککردن توکن توی درخواستهای Get بررسی نمیشه. مثال:
<form method="GET">
<input type="submit" value="ok!">
</form>
غیرفعال کردن CSRF Protection
گاهی اوقات لازمه که این قابلیت رو غیرفعال کنید (برای مثال موقع بازگشت از درگاه بانکی و دریافت نتایج بانک که بصورت Post ارسال میشه). برای این کار باید فیلد خاصی به اسم $enableCsrfProtection رو با مقدار false تنظیم کنید:
class MyController extends Controller
{
public $enableCsrfProtection = false;
class MyController extends Controller
{
public function beforeAction($action)
{
if (in_array($action->id, ['incoming', 'callback'])) {
$this->enableCsrfValidation = false;
}
retu parent::beforeAction($action);
}
این قابلیت بطور پیشفرض فعاله و شما فقط نیاز دارین که شناسه توکن مربوطه رو به فرم اضافه کنید. برای اینکار کافیه یک عنصر مخفی به فرمتون اضافه کنید:
<form method="POST">
<input id="form-token" type="hidden" name="<?= Yii::$app->request->csrfParam ?>"
value="<?= Yii::$app->request->csrfToken ?>"/>
<input type="submit" value="ok!">
</form>
برچسب:
نویسنده: خنجی