آموزش جامع و عملی جلوگیری از حملات CSRF در PHP به سبک گوگل
آشنایی با حمله CSRF (Cross-Site Request Forgery)
حمله جعل درخواست میانوبگاهی یا CSRF یکی از رایجترین و مخربترین آسیبپذیریهای وب است. در این نوع حمله، نفوذگر قربانی را فریب میدهد تا بدون اینکه متوجه شود، درخواستی ناخواسته را به وبسایتی که در آن احراز هویت شده است ارسال کند. برای مثال، تغییر رمز عبور، انتقال وجه یا تغییر ایمیل حساب کاربری بدون اطلاع کاربر انجام میشود.
شرکت گوگل و بنیاد OWASP استانداردهای سختگیرانهای برای مقابله با این حمله ارائه کردهاند. در این مقاله یاد میگیریم که چطور با پیادهسازی سیستم Synchronizer Token Pattern و استفاده از قابلیتهای مدرن کوکیها (SameSite) امنیت اپلیکیشن PHP خود را تضمین کنیم.
روش اول: پیادهسازی توکن ضد CSRF (Synchronizer Token Pattern)
گوگل استفاده از توکنهای منحصربهفرد و تصادفی برای هر سشن را به عنوان قویترین راهکار مقابله با CSRF معرفی میکند. روند کار به این صورت است که سرور یک رشته تصادفی تولید کرده و آن را در سشن کاربر ذخیره میکند. همچنین این توکن در فرمهای HTML گنجانده میشود. هنگام ارسال فرم، سرور توکن ارسالی را با توکن سشن مقایسه میکند.
گام اول: تولید توکن امن در سشن
ابتدا باید مطمئن شویم سشن آغاز شده و یک توکن امن با استفاده از توابع رمزنگاری قوی تولید میکنیم:
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
گام دوم: استفاده از توکن در فرمهای HTML
توکن ایجاد شده را باید در یک فیلد مخفی (Hidden input) در تمام فرمهایی که متدهای ناامن مانند POST، PUT یا DELETE دارند قرار دهیم:
< form action="submit.php" method="POST" >
< input type="hidden" name="csrf_token" value="" / >
< label for="email" >ایمیل جدید:< / label >
< input type="email" name="email" id="email" required / >
< input type="submit" value="بروزرسانی پروفایل" / >
< / form >
گام سوم: اعتبارسنجی توکن در سمت سرور
هنگام دریافت درخواست POST، باید بررسی کنیم که آیا توکن ارسال شده با توکن موجود در سشن مطابقت دارد یا خیر. برای مقایسه ایمن (بدون خطر حمله زمانبندی یا Timing Attack)، از تابع hash_equals استفاده میکنیم:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || !hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
// خطای امنیتی - درخواست غیرمجاز است
http_response_code(403);
die('خطای امنیتی: توکن امنیتی CSRF نامعتبر یا منقضی شده است.');
}
// درخواست معتبر است، پردازش را ادامه دهید
}
روش دوم: استفاده از ویژگی SameSite در کوکیها (توصیه جدی گوگل)
گوگل در نسخههای جدید کروم اهمیت بسیار زیادی به صفت SameSite در کوکیها داده است. با تنظیم این صفت روی مقدار Lax یا Strict، مرورگر اجازه نمیدهد کوکیهای احراز هویت در درخواستهای مشکوکی که از سایتهای سوم شخص (خارجی) صادر میشوند ارسال گردند.
در PHP میتوانید تنظیمات کوکی سشن را به شکل زیر پیکربندی کنید تا امنیت در سطح مرورگر نیز اعمال شود:
session_start([
'cookie_lifetime' =--> 86400,
'cookie_secure' => true, // حتماً از HTTPS استفاده کنید
'cookie_httponly' => true, // جلوگیری از دسترسی جاوااسکریپت به کوکی
'cookie_samesite' => 'Lax' // مقدار Lax یا Strict برای مقابله با CSRF
]);
نتیجهگیری و بهترین عملکردهای گوگل
برای داشتن یک اپلیکیشن ۱۰۰٪ ایمن در برابر حملات جعل درخواست، همواره به یاد داشته باشید:
- هیچگاه از متد GET برای انجام عملیات تغییر دهنده دادهها استفاده نکنید.
- سیستم تولید و تایید توکن CSRF را به صورت یک لایه میانی (Middleware) در معماری نرمافزار خود قرار دهید.
- کوکیهای سشن را همواره با فلگهای Secure، HttpOnly و SameSite تنظیم کنید.
پرسش و پاسخ
نظری یافت نشد
برای ارسال نظر ابتدا وارد شوید