簡介
為您的網站添加適當的安全防禦措施涉及解決潛在的漏洞,包括跨站點請求偽造(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; ?>" />
解決弱點>
不幸的是,目前的令牌產生方法採用了有缺陷的技術:實作強大的令牌產生器
要保護您的表單,請使用下列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 } }
其他注意事項
以上是如何在 PHP 表單中安全地實現 CSRF 令牌保護?的詳細內容。更多資訊請關注PHP中文網其他相關文章!