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

Timing Safe Verification with hash_equals المقارنة الآمنة ضد هجمات التوقيت بـ hash_equals

احمِ النماذج والعمليات الحساسة من هجمات تزوير الطلبات عبر المواقع CSRF باستخدام random_bytes والمقارنة الثابتة زمنياً hash_equals.
1 صفوف تعليمية
PHP
0 مشاهدة

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

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

عند وصول طلب POST، تحقق من تطابق التوكن المرسل مع توكن الجلسة باستخدام الدالة hash_equals($knownSessionToken, $userSubmittedToken) بدلاً من المعامل ===.

  • يتوقف المعامل التقليدي === عند أول بايت غير متطابق، مما قد يسرب فروقاً زمنية دقيقة.
  • تقارن دالة hash_equals() جميع البايتات في زمن ثابت عندما يكون النصان متساويين في الطول.
  • تأكد دائماً من كون المدخل نصاً عبر (string) ($_POST["csrf_token"] ?? "") قبل تمريره إلى hash_equals() لتجنب خطأ TypeError في PHP 8.

يضمن فحص $sessionToken === "" أولاً عدم تطابق جلسة فارغة مع مدخل فارغ، ثم تجري hash_equals() المقارنة الآمنة في زمن ثابت.

مخطط تدفق التنفيذ العملي لقسم المقارنة الآمنة ضد هجمات التوقيت بـ hash_equals في لغة PHP
PHP
<?php
$_SESSION['csrf_token'] = "4f8b2e9a1c7d60354f8b2e9a1c7d6035";
$_POST['csrf_token']    = "4f8b2e9a1c7d60354f8b2e9a1c7d6035";

$sessionToken = $_SESSION['csrf_token'] ?? '';
$postToken    = (string) ($_POST['csrf_token'] ?? '');

if ($sessionToken === '' || !hash_equals($sessionToken, $postToken)) {
    http_response_code(403);
    exit("403 CSRF Rejected\n");
}
echo "CSRF Token Verified Safely!\n";