問題可能源自於令牌產生方法,因為所提供的程式碼是容易受到預測和缺乏熵的影響。此方法對於一次性使用和每次表單令牌驗證也是不夠的。
將令牌產生替換為安全PHP 7 或PHP 5.3 的方法:
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
session_start();
if ($($_SESSION['令牌'])) {
if (function_exists('mcrypt_create_iv')) { $_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); } else { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32)); }
}
$token = $_SESSION['token'];
使用hash_equals() 驗證令牌安全地:
使用hash_equals() 驗證令牌安全地:
if (hash_equals($_SESSION['token'], $_POST['token'])) { // Proceed to process the form data } else { // Log this as a warning and keep an eye on these attempts }
進一步限制將代幣轉換為特定形式,請使用hash_hmac():
echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
使用此函數,安全通用令牌可以用作:
雖然可以使用下列方式產生每個表單令牌:
以上是為什麼我的 CSRF 令牌在 AJAX 和標準表單中使用時有時為空,如何在 PHP 中修復此問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!