使用隨機位元組產生強令牌
在在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中文網其他相關文章!