首页 > 后端开发 > php教程 > 为什么我的 CSRF 令牌在 AJAX 和标准表单中使用时有时为空,如何在 PHP 中修复此问题?

为什么我的 CSRF 令牌在 AJAX 和标准表单中使用时有时为空,如何在 PHP 中修复此问题?

Linda Hamilton
发布: 2024-12-14 20:46:13
原创
647 人浏览过

Why are my CSRF tokens sometimes empty when used in AJAX and standard forms, and how can I fix this in PHP?

在 PHP 中使用正确的 CSRF 令牌实施来保护表单

问题:


< ;p>当尝试将 CSRF 令牌添加到两种不同的表单时,其中一种使用AJAX 和其他基本联系表单,观察到 HTML 中的令牌值偶尔为空。如何解决这个问题?

答案:

问题可能源于令牌生成方法,因为提供的代码是容易受到预测和缺乏熵的影响。此方法对于一次性使用和每次表单令牌验证也是不够的。

生成强 CSRF 令牌:

将令牌生成替换为安全PHP 7 或 PHP 5.3 的方法:

PHP 7


session_start();
if (empty($_SESSION['token'])) {

$_SESSION['token'] = bin2hex(random_bytes(32));
登录后复制

}
$token = $_SESSION['token'];

PHP 5.3(或使用 ext-mcrypt)


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'];

验证 CSRF 令牌:

使用 hash_equals() 验证令牌安全地:


if (!empty($_POST['token'])) {

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
}
登录后复制

}

Per -表单令牌限制:

进一步限制将令牌转换为特定形式,请使用 hash_hmac():


echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
登录后复制

?> ;” />

与 Twig 集成的混合方法:

对于那些使用 Twig 模板的人,可以使用简化的双重策略实现:


$twigEnv->addFunction(

new \Twig_SimpleFunction(
    'form_token',
    function($lock_to = null) {
        if (empty($_SESSION['token'])) {
            $_SESSION['token'] = bin2hex(random_bytes(32));
        }
        if (empty($_SESSION['token2'])) {
            $_SESSION['token2'] = random_bytes(32);
        }
        if (empty($lock_to)) {
            return $_SESSION['token'];
        }
        return hash_hmac('sha256', $lock_to, $_SESSION['token2']);
    }
)

);

使用此函数,安全通用令牌可以用作:


<输入类型=“隐藏”名称=“令牌” value="{{ form_token() }}" />

虽然可以使用以下方式生成每个表单令牌:


来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板