我不明白使用「挑戰令牌」如何增加任何形式的預防:什麼值應該與什麼進行比較?
來自 OWASP:
一般來說,開發者只需要 產生此令牌一次 目前會話。初始後 該代幣的生成,其值為 儲存在會話中並被使用 對於每個後續請求,直到 會話過期。
如果我正確理解了這個過程,就會發生這樣的情況。
我登入 http://example.com 並建立一個包含此隨機令牌的會話/cookie。然後,每個表單都包含一個隱藏輸入,該輸入還包含來自會話的隨機值,該值在表單提交時與會話/cookie 進行比較。
但這能實現什麼目的呢?您不是只是獲取會話數據,將其放入頁面中,然後將其與完全相同的會話數據進行比較嗎?看起來像是循環推理。這些文章一直在談論遵循“同源策略”,但這沒有任何意義,因為所有 CSRF 攻擊都與用戶同源,只是欺騙用戶做出他/她不希望的操作。
除了將令牌作為查詢字串附加到每個 URL 之外,還有其他選擇嗎?看起來非常醜陋且不切實際,並且使用戶更難添加書籤。
CSRF 透過類比解釋 - 範例:
冒充者拿走了你所有的錢,也許在出去的時候玩了一些 Xbox......
摘要
CSRF 基本上依賴於這樣一個事實:您打開了家門,然後將其打開,讓其他人可以簡單地走進來並假裝是您。
如何解決這個問題?
當您第一次打開家門時,門衛會給您一張紙,上面寫著一個很長且非常隨機的數字:
現在,如果你想進入自己的房子,你必須向門衛出示那張紙才能進去。
所以現在當冒充者試圖進入你的房子時,警衛會問:
「紙上寫的隨機數是多少?」
如果冒充者沒有正確的數字,那麼他就無法進入。要嘛他必須正確猜測隨機數 - 這是一項非常困難的任務。更糟的是,隨機數的有效期限只有 20 分鐘(例如)。所以知道模仿者必須猜對,不只如此,他只有20分鐘的時間才能得到正確答案。這實在是太費勁了!所以他放棄了。
當然,這個類比有點牽強,但我希望它對你有幫助。
**crud =(建立、讀取、更新刪除)
攻擊者無法取得令牌。因此請求不會生效。
我推薦 Gnucitizen 的這篇文章。它有一個相當不錯的 CSRF 解釋: http://www.gnucitizen.org/blog/csrf-揭秘/
#