首页 >后端开发 >php教程 >如何使用 PHP 保护我的 Web 表单免受 CSRF 攻击?

如何使用 PHP 保护我的 Web 表单免受 CSRF 攻击?

Linda Hamilton
Linda Hamilton原创
2024-12-09 05:37:14924浏览

How Can I Secure My Web Forms Against CSRF Attacks Using PHP?

使用 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn