简介
向您的网站添加适当的安全防御措施涉及解决潜在的漏洞,包括跨站点请求伪造(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; ?>" />
解决弱点
不幸的是,当前的令牌生成方法采用了有缺陷的技术:
实现强大的令牌生成器
要保护您的表单,请使用以下 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 } }
其他注意事项
以上是如何在 PHP 表单中安全地实现 CSRF 令牌保护?的详细内容。更多信息请关注PHP中文网其他相关文章!