使用随机字节生成强令牌
在在 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中文网其他相关文章!