2013-08-03 65 views
0

我是一個web應用程序的新手。我知道SO中已經提出了XSRF保護問題,但問題是針對特定語言(例如RoR/Python)或庫(jQuery)的。我想知道如何在我的Web應用程序中實現XSRF保護。如何在Web應用程序中設置XSRF保護?

我的理解是,XSRF保護依賴於使用唯一的隨機標記,在發出HTTP請求時必須進行身份驗證。我有以下問題:

  1. 什麼時候認證令牌被初始化?是否應該在頁面加載時設置(即GET請求)?
  2. 令牌應該在哪裏初始化?它們是否應該在輸入字段,Cookie或請求標頭中設置?這個隨機值是如何產生的?我如何堅持這個價值以便用於比較?
  3. 驗證令牌何時應驗證?我如何比較認證令牌?我如何將這些令牌與我一直堅持的令牌進行比較?

在設置同步表單請求和AJAX請求方面有差異嗎?

+2

嘗試獲得在OWASP網站https://www.owasp.org/index.php/Top_10_2013-A8-Cross-Site_Request_Forgery_(CSRF) – LRA

回答

2

什麼時候認證令牌被初始化?

在會話期間,用戶第一次到達包含任何您希望防止CSRF攻擊的表單的頁面。

是否應該在頁面加載時設置(即GET請求)?

當生成HTML時,它應該嵌入到表單中。

它們是否應該在輸入字段,Cookie或請求標頭中設置?

隱藏輸入。

使用cookie將會錯過(它來自頁面並且不會保留在瀏覽器中)。額外的標題只能在使用XHR時使用,使用一般方法。

這個隨機值是如何產生的?

用隨機數發生器

我怎樣才能堅持這個值被用於比較?

會議

何時認證令牌驗證?

作爲授權步驟的一部分。

我如何比較認證令牌?我如何將這些令牌與我一直堅持的令牌進行比較?

if ($request->paramaters->{csrf} eq $session->data->{csrf}) 

是否有差異的設置爲同步表單請求對一個AJAX請求?

不,你還有一個會話,你仍然有一段POST數據是令牌。

+0

更多信息「提供一個隨機數生成器」 - 確保該發生器隨着一些語言基於可預測的種子(例如午夜過後的秒)提供隨機數,所以是安全的隨機數生成器。 – SilverlightFox

0

我不打算談論一個特定的解決方案,你必須遵循的,因爲有很多,我會談論主要的想法,而不是你想要的實現它。

防止XSRF的關鍵思想是將一個隨機令牌存儲在其他域的代碼無法訪問的地方(例如cookie)。您可以在服務器端生成此令牌,並指示瀏覽器在整個會話中本地存儲它。 (並不需要堅持在服務器端的任何東西)每當你執行一個請求

,發送:

  • 令牌在存儲(如果您使用的cookie,瀏覽器會自動發送)。
  • 同樣的道理在你的要求(取決於服務器的代碼如何得到它使用隱藏字段無論是作爲標題或正文)

在服務器端存儲的一個,服務器將檢查比賽。

jQuery的一個示例代碼(使用jQuery的Cookie插件):

$.ajax({ 
    url:"someurl", 
    data:{token:$.cookie('token')} 
}); 

讀取cookie中的能力證明,這是從你的域,而不是外部域 有實現這種不同的方式機制(不需要堅持一個具體的解決方案),只要他們堅持的主要思路:

  • 從其他領域中佔有一席之地碼存儲在瀏覽器中一個祕密令牌不能讀取它。
  • 將祕密令牌和從瀏覽器發送到您的服務器的同一標記。能夠發送同樣的標記證明這不是XSRF請求。

我該如何堅持這個值才能用於比較?

我們可以將其存儲爲cookie或會話變量。我個人更喜歡cookie,因爲:

  • 減少服務器端的內存消耗。
  • 我們不需要在每個生成的HTML文件中包含該標記,以便瀏覽器將其發回。

是否有差異的設置爲同步表單請求 對一個AJAX請求?

沒有,只要你能證明這不是在請求發送同樣一個XSRF請求。無論標記是什麼(隱藏字段,自定義標題,..)。在Form的情況下,人們通常會將其作爲隱藏字段發送。