首頁 >後端開發 >php教程 >如何在 PHP 表單中安全地實現 CSRF 令牌保護?

如何在 PHP 表單中安全地實現 CSRF 令牌保護?

DDD
DDD原創
2024-12-17 20:00:20333瀏覽

How to Securely Implement CSRF Token Protection in PHP Forms?

管理CSRF 防禦技術:使用PHP 表單演練

簡介

為您的網站添加適當的安全防禦措施涉及解決潛在的漏洞,包括跨站點請求偽造(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; ?>" />

解決弱點>

不幸的是,目前的令牌產生方法採用了有缺陷的技術:

    rand() 不是可靠的隨機來源。
  • uniqid() 產生有限數量的熵。
  • md5( )不會貢獻熵,而是排列

實作強大的令牌產生器

要保護您的表單,請使用下列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
    }
}

其他注意事項

    考慮使 CSRF 令牌特定於每個表單以增強安全性。
  • 為了進一步保護,請利用 Twig 範本引擎來簡化令牌處理並將其整合到您的範本。
  • 探索專門庫的使用,例如 Paragon Initiative Enterprises 的 Anti-CSRF 庫,以實現獨特的一次性 CSRF 令牌。

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

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