آموزش رایگان PHP

آموزش جامع و عملی جلوگیری از حملات CSRF در PHP به سبک گوگل

1405/08/03 23:39 محراب حسن زاده
آموزش جامع و عملی جلوگیری از حملات 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 تنظیم کنید.

پیشنمایش

پرسش و پاسخ

نظری یافت نشد

مطالب مشابه

آموزش گام به گام ساخت سیستم لاگین و لاگ‌اوت در PHP به صورت ایمن
1405/05/14 22:13

آموزش گام به گام ساخت سیستم لاگین و لاگ‌اوت در PHP به صورت ایمن

مطالعه بیشتر
تفاوت آرایه عددی، انجمنی و چندبعدی در PHP: راهنمای جامع و کاربردی
1405/03/24 01:07

تفاوت آرایه عددی، انجمنی و چندبعدی در PHP: راهنمای جامع و کاربردی

مطالعه بیشتر
راهنمای کامل لیست‌ها در HTML: آموزش انواع و اصول سئو
1402/05/20 22:02

راهنمای کامل لیست‌ها در HTML: آموزش انواع و اصول سئو

مطالعه بیشتر
اصول پایه React.js: آشنایی با کامپوننت‌ها، وضعیت و رندرینگ
1402/06/28 23:20

اصول پایه React.js: آشنایی با کامپوننت‌ها، وضعیت و رندرینگ

مطالعه بیشتر
توابع فلش (Arrow Functions) در جاوا اسکریپت: ساده‌سازی کد با استفاده از ES6
1403/06/02 20:36

توابع فلش (Arrow Functions) در جاوا اسکریپت: ساده‌سازی کد با استفاده از ES6

مطالعه بیشتر
آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var
1402/06/18 22:41

آموزش متغیرهای سفارشی (Custom Properties) در CSS: نحوه تعریف و استفاده از var

مطالعه بیشتر
Async/Await: نوشتن کدهای خواناتر و ناهم‌زمان در جاوا اسکریپت - آموزش کامل با مثال‌ها
1403/07/30 20:50

Async/Await: نوشتن کدهای خواناتر و ناهم‌زمان در جاوا اسکریپت - آموزش کامل با مثال‌ها

مطالعه بیشتر
آموزش استایل‌دهی لیست‌ها در CSS: طراحی و استایل‌دهی ul و ol
1403/08/10 21:33

آموزش استایل‌دهی لیست‌ها در CSS: طراحی و استایل‌دهی ul و ol

مطالعه بیشتر
آموزش جامع اعتبارسنجی حجم و نوع فایل آپلودی در PHP طبق استانداردهای امنیتی گوگل
1405/05/01 20:20

آموزش جامع اعتبارسنجی حجم و نوع فایل آپلودی در PHP طبق استانداردهای امنیتی گوگل

مطالعه بیشتر
آموزش کامل و اصولی اتصال PHP به پایگاه داده MySQL (به روش PDO و MySQLi)
1405/05/04 23:34

آموزش کامل و اصولی اتصال PHP به پایگاه داده MySQL (به روش PDO و MySQLi)

مطالعه بیشتر
آموزش جامع اعتبارسنجی اطلاعات فرم در PHP طبق استانداردهای امنیتی گوگل
1405/04/27 22:17

آموزش جامع اعتبارسنجی اطلاعات فرم در PHP طبق استانداردهای امنیتی گوگل

مطالعه بیشتر
آموزش Prepared Statement در PHP: امن‌سازی دیتابیس در برابر SQL Injection
1405/05/13 21:17

آموزش Prepared Statement در PHP: امن‌سازی دیتابیس در برابر SQL Injection

مطالعه بیشتر

تمامی حقوق معتلق به ناشر سایت است و کپی از آن پیگرد قانونی دارد