在PHP中如何生成和驗(yàn)證CSRF令牌

PHP
小樊
91
2024-09-12 15:48:07

在 PHP 中,生成和驗(yàn)證 CSRF 令牌可以通過(guò)以下步驟完成:

  1. 生成 CSRF 令牌

為了生成一個(gè) CSRF 令牌,你需要?jiǎng)?chuàng)建一個(gè)唯一的隨機(jī)字符串。這可以使用 PHP 的內(nèi)置函數(shù) bin2hex()random_bytes() 來(lái)實(shí)現(xiàn)。將生成的令牌存儲(chǔ)在用戶(hù)的會(huì)話中,以便稍后進(jìn)行驗(yàn)證。

session_start();

if (!isset($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
  1. 將 CSRF 令牌添加到表單中

將生成的 CSRF 令牌添加到 HTML 表單中,以便在提交表單時(shí)將其發(fā)送回服務(wù)器??梢詫⒘钆谱鳛殡[藏字段包含在表單中。

<form action="submit.php" method="post">
    <!-- 其他表單字段 -->
   <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
   <input type="submit" value="提交">
</form>
  1. 驗(yàn)證 CSRF 令牌

當(dāng)用戶(hù)提交表單時(shí),需要檢查提交的令牌是否與會(huì)話中存儲(chǔ)的令牌匹配。這可以確保只有合法的請(qǐng)求才能被處理。

在表單提交的處理腳本(在本例中為 submit.php)中,執(zhí)行以下操作:

session_start();

if (isset($_POST['csrf_token']) && hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'])) {
    // 驗(yàn)證成功,處理表單數(shù)據(jù)
} else {
    // 驗(yàn)證失敗,顯示錯(cuò)誤消息或處理錯(cuò)誤
    echo "Invalid CSRF Token!";
}

hash_equals() 函數(shù)用于比較兩個(gè)字符串,避免了它們?cè)诒容^過(guò)程中可能出現(xiàn)的時(shí)序攻擊。

通過(guò)以上方法,你可以在 PHP 應(yīng)用程序中生成和驗(yàn)證 CSRF 令牌,從而提高應(yīng)用程序的安全性。

0