使用 CSRF 令牌保护 Web 表单:包含 PHP 示例的综合指南
跨站请求伪造 (CSRF) 是一种恶意攻击技术利用网络漏洞代表用户执行未经授权的操作。为了保护您的网站免受 CSRF 侵害,实施强大的令牌机制至关重要。本文提供了使用 PHP 添加 CSRF 令牌的详细指南,解决了在此过程中面临的挑战。
生成安全令牌
生成 CSRF 令牌时,必须使用可靠的随机源以避免可预测性并确保足够的熵。 PHP 7 提供了 random_bytes() 函数,而 PHP 5.3 可以利用 mcrypt_create_iv() 或 openssl_random_pseudo_bytes() 来实现此目的。避免使用 rand() 或 md5() 等易受攻击的方法。
PHP 7 的示例:
if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } $token = $_SESSION['token'];
PHP 5.3 的示例(或使用ext-mcrypt):
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'];
与表单集成
在 HTML 表单中,包含一个输入字段,用于将生成的 CSRF 令牌安全地传送到服务器:
<input type="hidden" name="token" value="<?php echo $token; ?>" />
令牌验证
提交表单后,使用会话中存储的令牌验证提交的令牌:
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 } }
每表单令牌和 HMAC
为了提高安全性,请考虑使用每个表单令牌。生成单独的 HMAC 密钥并使用 hash_hmac() 将 CSRF 令牌锁定为特定形式。
$calc = hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']); if (hash_equals($calc, $_POST['token'])) { // Continue... }
与 Twig 的混合方法
Twig 用户可以利用生成通用函数和锁定函数的自定义函数令牌:
{{ form_token() }} {{ form_token('/my_form.php') }}
一次性 CSRF 令牌
对于需要一次性令牌的场景,请考虑使用外部库,例如 Paragon Initiative Enterprises 的 Anti- CSRF 库,管理代币赎回和到期。
通过实施这些技术,您可以有效地保护您的网站免受 CSRF 攻击并确保用户交互的完整性。
以上是如何使用 PHP 保护我的 Web 表单免受 CSRF 攻击?的详细内容。更多信息请关注PHP中文网其他相关文章!