首頁 >後端開發 >php教程 >如何在 PHP 中安全地實作 CSRF 令牌?

如何在 PHP 中安全地實作 CSRF 令牌?

Patricia Arquette
Patricia Arquette原創
2024-12-08 00:39:12325瀏覽

How to Securely Implement CSRF Tokens in PHP?

如何在PHP 實現CSRF 令牌:綜合指南

使用隨機位元組產生強令牌

在在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') }}" />

一次性CSRFRF令牌

如果需要,請考慮使用專門的庫來管理一次性CSRF 令牌,例如Anti-CSRF Paragon Initiative Enterprises 的圖書館。

以上是如何在 PHP 中安全地實作 CSRF 令牌?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn