首页 > 后端开发 > php教程 > 如何在 PHP 中安全地实现 CSRF 令牌?

如何在 PHP 中安全地实现 CSRF 令牌?

Patricia Arquette
发布: 2024-12-08 00:39:12
原创
322 人浏览过

How to Securely Implement CSRF Tokens in PHP?

如何在 PHP 中实现 CSRF 令牌:综合指南

使用随机字节生成强令牌

在在 CSRF 令牌生成的上下文中,使用 rand() 和 uniqid() 由于其可预测性和有限性而带来安全风险熵。相反,请选择:

session_start();
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
登录后复制

安全地验证 CSRF 令牌

避免使用直接相等检查(== 或 ===)。相反,对于 PHP 5.6 使用 hash_equals() 或对于早期版本使用 paragonie/hash-compat:

if (!empty($_POST['token'])) {
    if (hash_equals($_SESSION['token'], $_POST['token'])) {
         // Proceed to form data processing
    } else {
         // Log and monitor these attempts
    }
}
登录后复制

使用每表单令牌增强安全性

限制令牌对于特定的形式,使用hash_hmac():

echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
登录后复制
$calc = hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
if (hash_equals($calc, $_POST['token'])) {
    // Continue...
}
登录后复制

简单的混合方法

使用 Twig 模板,您可以使用自定义 Twig 函数来简化令牌生成:

$twigEnv->addFunction(
    new \Twig_SimpleFunction(
        'form_token',
        function($lock_to = null) { // ... }
    )
);
登录后复制
<input type="hidden" name="token" value="{{ form_token() }}" />
登录后复制

或者,对于锁定令牌:

<input type="hidden" name="token" value="{{ form_token('/my_form.php') }}" />
登录后复制

一次性 CSRF 令牌

如果需要,请考虑使用专门的库来管理一次性 CSRF 令牌,例如 Anti-CSRF Paragon Initiative Enterprises 的图书馆。

以上是如何在 PHP 中安全地实现 CSRF 令牌?的详细内容。更多信息请关注PHP中文网其他相关文章!

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