2011-11-19 47 views
8

在代碼中,我已經看到了這一個登錄頁面創建令牌:原因在HTML表單使用令牌和PHP校驗碼

$token = $_SESSION['token'] = md5(uniqid(mt_rand(),true));

那麼這個令牌迴盪在一個隱藏的輸入登錄表單和提交的,用於驗證登錄的php代碼還檢查此令牌,如:

public function isTokenValid() 
{ 
    return (!isset($_SESSION['token']) || $this->_token != $_SESSION['token'])? 0 : 1; 
} 

此令牌的用途是什麼?

編輯:該頁面介紹它的使用:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet

回答

8

喜歡這種方法通常用於防止CSRF vulnerabilities

+0

謝謝。這個頁面清楚地告訴了這個令牌方法:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet –

1

這是用來防止跨站請求僞造攻擊,從而非授權用戶可以強制當前登錄(授權)用戶通過製作鏈接生成表單帖子來在您的網站上執行請求。

這個想法是,您的網站必須首先生成反CSRF令牌並將其傳遞給授權客戶端。但是這個令牌對攻擊者來說是未知的,並且必須用來完成一個有效的請求回到你的網站。

如果Facebook未使用令牌對CSRF進行適當保護,則示例CSRF攻擊可能會誘使用戶點擊鏈接,從而導致垃圾帖被張貼到用戶的Facebook流。由於用戶已經登錄,攻擊的網站(Facebook)將發佈請求視爲有效。

+0

好的謝謝邁克爾。 –

1

令牌對CSRF攻擊提供某種級別的保護很有用,它們對於強制限制提交表單也很有用。

或者簡單地說,可以用來防止有人無意中通過兩次點擊提交按鈕來兩次提交相同的表單。

例如:您正在銀行網站上從賬戶A到賬戶B在線轉賬10美元。當「轉賬資金」屏幕出現時,後臺是一個獨特的令牌。您輸入賬戶和賬戶的金額,然後按提交按鈕,然後在下一頁加載之前再次按下按鈕。

您的瀏覽器發送兩次HTTP POST。對於第一個請求,服務器接收令牌,確認它是有效的,然後刪除或將其標記爲無效。對於第二個請求,服務器發現(相同)令牌不再有效,並且不處理傳輸。如果沒有這樣做,你只需要轉移20美元而不是10美元。

想一想,它的一種方法是當你加載一個表單時,你特別爲你剛剛加載的表單的那個實例獲得一個標記。如果你想提交,使用令牌。一旦你使用了令牌,它就消失了。想要另一個令牌?重新加載頁面/表單以獲得另一個。

注:有辦法使用JavaScript來防止重複點擊按鈕,這應該也可以用,但如果有其他一些原因重複的HTTP請求(瀏覽器錯誤,硬件問題仍然沒有幫助,等等。)。任何導致數據更改或使用資源(如打印)的事務都應使用令牌,不應無意中複製令牌。

+0

非常感謝 –