我想在我的網站表單中正確實作一個帶有驗證的 CSRF 令牌。
下面是生成令牌的方式:
$_SESSION["token"] = bin2hex(random_bytes(32));
這是我的表單內的隱藏欄位,每次提交表單或重繪 頁面時都會更改:
<input type="hidden" name="token" value="<?=$_SESSION["token"]?>">
以下是檢查表單時看到的示例:
<input type="hidden" name="token" value="3c33c5dc178293f9bcaff264b90836780887efe16c339d01c1cbe34bf9ecbddd">
現在,當提交表單時,這是我為令牌設定的驗證:
if($_SERVER["REQUEST_METHOD"] == "POST")
{
//CSRF TOKEN VALIDATION
if (!isset($_POST['token']) || ($_POST['token'] !== $_SESSION['token'])) {
exit;
}
我想知道這是否驗證了($_POST['token'] !== $_SESSION['token'])
?
因為當我將腳本更改為此時:
if($_SERVER["REQUEST_METHOD"] == "POST")
{
//CSRF TOKEN VALIDATION
if (!isset($_POST['token'])) {
exit;
}
沒有任何變化,并且提交的表單與以前完全相同。
我原來的 IF 陳述句是否只檢查$_POST
isset 嗎?
如果是這樣,這仍然是防止 CSRF 攻擊的安全方法嗎?
uj5u.com熱心網友回復:
if (!isset($_POST['token']) || ($_POST['token'] !== $_SESSION['token'])) {
這會檢查:
- 如果有令牌(如果沒有則失敗)和
- 如果提交中的令牌與會話中的令牌匹配(如果不匹配則失敗)。
if (!isset($_POST['token'])) {
這會檢查:
- 如果有令牌(如果沒有則失敗)和
…但不在乎它是否與會話中的匹配。
這意味著第二個版本很容易受到攻擊,因為進行 CSRF 攻擊的攻擊者可以將任何舊令牌塞入他們提交的表單中,并且只要用戶登錄它就可以作業。
第一個版本不易受到攻擊,因為攻擊者無法知道您網站上訪問者會話中的令牌是什么,因此他們無法將其放入表單中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/508468.html