2013-01-16 167 views
-1

防止CSRF的一種方法是在表單中使用令牌。通過大量的文章去之後,我想通了,該步驟通常是沿着這些線路:防止跨站點請求僞造

  1. 產生被encryted一個令牌值,將其存儲在一個會話,在一個隱藏字段中設置的令牌值表格。
  2. 在表單處理頁面比較隱藏字段令牌值和這樣的平等對話價值:$ _ POST [「令牌」] == $ _SESSION [「令牌」]

我的問題是我爲什麼要加密令牌值?假設我使用GET方法並且攻擊者知道我將使用一個簡單的整數值,讓我們說1到1000. 如果攻擊者要使用圖像僞造請求,那麼他將不得不發送1000張圖片蠻力請求..好嗎?或者有沒有其他辦法可以做到這一點?

另外我已經讀過,單獨使用POST方法不足以防止CSRF請求。所以我的第二個問題是,如果這是真的,如果我使用POST方法,攻擊者如何成功創建僞造的請求?

+1

你不需要加密令牌,你只需要使它隨機,所以不要使用1到1000之間的數字,通常生成一個長的令牌sha1或md5,一些隨機的字符串就足夠了。如果您的網站上有表單,我可以在我的網站上覆製表單的「操作」指向您的網站,並在我的網站上提交表單的JavaScript,並且它將顯示爲表單的POST請求。 –

回答

0

對於使用許多自動化進程和應用程序執行1000次強力請求的攻擊者而言,這只是幾分鐘的問題。

因此這是好事,這樣設置令牌:

$token = md5(uniqid(rand(), true)); 

通過這個,你總是落得唯一的隨機令牌,而在所有不需要加密 - 它只是增加了更多的困惑: - )。使用你喜歡的加密方法,有人只用​​sha1()這些天,有些更進一步。但這不是五角大樓安全區,只是一個隨機令牌不應該很容易猜測做了暴力攻擊。

使用POST方法確實是不夠的 - 我已經安裝了一個擴展到我的Firefox,它可以選擇一個帶GET參數的URL並將其轉換爲POST請求。容易作爲複製+粘貼+點擊。

另外,您不需要將令牌設置爲隱藏字段,也可以在從GET讀取令牌和POST數組中的表單數據時,將其用作表單動作URL的GET參數。

+0

或者使用Cookie,您不需要在每個頁面/鏈接上應用令牌。 – Laurence

+0

但是你說的那些「自動化流程和應用程序」只能在服務器端正常工作?你如何讓這些應用程序從受害者瀏覽器發送請求? – depz123

相關問題