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

如何在 PHP 表单中安全地实现 CSRF 令牌保护?

DDD
发布: 2024-12-17 20:00:20
原创
318 人浏览过

How to Securely Implement CSRF Token Protection in PHP Forms?

管理 CSRF 防御技术:使用 PHP 表单演练

简介

向您的网站添加适当的安全防御措施涉及解决潜在的漏洞,包括跨站点请求伪造(CSRF)。本文深入探讨如何使用 PHP 有效添加 CSRF 令牌。

了解问题

您已在网站上实现了 CSRF 令牌保护,但令牌的值不一致存在于 HTML 表单中。具体来说,“联系我们”和 AJAX 表单都存在此问题。

查看代码

让我们仔细检查用于注入的代码token:

PHP:

if (!isset($_SESSION)) {
    session_start();
    $_SESSION['formStarted'] = true;
}

if (!isset($_SESSION['token'])) {
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
}
登录后复制

HTML:

<input type="hidden" name="token" value="<?php echo $token; ?>" />
登录后复制

解决弱点

不幸的是,当前的令牌生成方法采用了有缺陷的技术:

  • rand() 不是可靠的随机源。
  • uniqid() 产生有限数量的熵。
  • md5( )不会贡献熵,而是排列

实现强大的令牌生成器

要保护您的表单,请使用以下 PHP 代码:

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 (empty($_SESSION['token'])) {
    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 令牌以防止尝试利用:

if (!empty($_POST['token'])) {
    if (hash_equals($_SESSION['token'], $_POST['token'])) {
         // Proceed to process the form data
    } else {
         // Log this as a warning and monitor such attempts
    }
}
登录后复制

其他注意事项

  • 考虑使 CSRF 令牌特定于每个表单以增强安全性。
  • 为了进一步保护,利用 Twig 模板引擎来简化令牌处理并将其集成到您的模板。
  • 探索专门库的使用,例如 Paragon Initiative Enterprises 的 Anti-CSRF 库,以实现独特的一次性 CSRF 令牌。

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

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