انتقل إلى محتوى الدرس

Verifying CSRF Tokens in AJAX Requests التحقق من توكن CSRF في طلبات AJAX

أرسل النماذج بدون تحديث الصفحة باستخدام FormData، وأرجع أخطاء التحقق لكل حقل من PHP، وابنِ نظام تصويت تفاعلي فوري.
1 صفوف تعليمية
PHP
0 مشاهدة

شرح صفوف ومحتوى الفقرة

الصف 1 شرح توضيحي

تشارك طلبات AJAX المرسلة بطرق POST وPUT وDELETE كوكيز جلسة المستخدم، ولذلك تتطلب التحقق من توكن CSRF تماماً كالنماذج التقليدية.

  • في نماذج FormData، يُرسل الحقل المخفي <input type="hidden" name="csrf_token"> تلقائياً ويُقرأ من $_POST["csrf_token"].
  • في طلبات JSON، اقرأ التوكن من وسم <meta name="csrf-token" content="..."> وأرسله في رأس الطلب X-CSRF-Token.
  • يحوّل PHP اسم الرأس X-CSRF-Token تلقائياً ليصبح متاحاً داخل المصفوفة $_SERVER["HTTP_X_CSRF_TOKEN"].

يتيح استخدام سلسلة دمج الفارغ $_POST["csrf_token"] ?? $_SERVER["HTTP_X_CSRF_TOKEN"] ?? "" دعم كل من نماذج FormData وطلبات JSON المرسلة برأس مخصص.

PHP
<?php
$_SESSION['csrf_token']       = '7f4e9a2c1b8d6035';
$_SERVER['HTTP_X_CSRF_TOKEN'] = '7f4e9a2c1b8d6035';

$candidate = (string) ($_POST['csrf_token'] ?? $_SERVER['HTTP_X_CSRF_TOKEN'] ?? '');
$sessToken = $_SESSION['csrf_token'] ?? '';

$valid = ($sessToken !== '') && hash_equals($sessToken, $candidate);
echo json_encode(['ok' => $valid, 'csrf_verified' => $valid]) . "\n";