شرح صفوف ومحتوى الفقرة
عند وصول طلب POST، تحقق من تطابق التوكن المرسل مع توكن الجلسة باستخدام الدالة hash_equals($knownSessionToken, $userSubmittedToken) بدلاً من المعامل ===.
- يتوقف المعامل التقليدي
===عند أول بايت غير متطابق، مما قد يسرب فروقاً زمنية دقيقة. - تقارن دالة
hash_equals()جميع البايتات في زمن ثابت عندما يكون النصان متساويين في الطول. - تأكد دائماً من كون المدخل نصاً عبر
(string) ($_POST["csrf_token"] ?? "")قبل تمريره إلىhash_equals()لتجنب خطأTypeErrorفي PHP 8.
يضمن فحص $sessionToken === "" أولاً عدم تطابق جلسة فارغة مع مدخل فارغ، ثم تجري hash_equals() المقارنة الآمنة في زمن ثابت.
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";