2014-02-28 104 views
0

我有一個場景,我已經有CSRF令牌,但我必須刪除。在電子商務中,產品頁面由Varnish緩存,因此如果用戶直接在此處登錄,他將不會有會話ID來驗證令牌。在這個頁面中,我有一個「添加到購物車」按鈕,它具有CSRF標記,但當然它被緩存了錯誤的標記。避免CSRF令牌

我的問題是:還有另一種方法來獲得CSRF保護而不依賴於使用令牌隱藏的輸入?放置按鈕的頁面必須被緩存,所以在這種情況下令牌不好。

謝謝。

回答

0

您可以使用Cookie作爲CSRF,將cookie設置在表單頁面上並在下一個頁面上進行檢查。它可能需要一些調整,但它會繞過緩存。

不要忘記將Varnish配置爲不放棄該cookie。

1

有標題"Double Submit Cookies"

它提交會話ID與以下形式,其中的javascript讀取該cookie值和注入它作爲一個隱藏的輸入元件的形式在OWASP CSRF預防速查表描述的替代方法。爲此,您的會話cookie不得標記爲HTTPOnly,這是一種不好的做法。所以你在嘗試添加一些CSRF時會失去一些會話cookie的安全性。

作爲對此方法的改進,您可以創建另一個具有存儲CSRF令牌值的登錄名的cookie,並使用此cookie代替sessionid cookie。現在您可以將sessionid cookie標記爲HTTPOnly。 (未標示CSRF cookie裏的HttpOnly也是一種不好的做法,但因爲之前並不重要)

(每一頁上我認爲通過AJAX檢索CSRF令牌要求不是出於性能的考慮的一個選項)

2

對於CSRF令牌有效,您需要能夠在Cookie機制之外提交它。你可以讓你的頁面執行一個AJAX POST到你的站點以檢索CSRF令牌。

例如https://www.example.com/GetCSRFToken

響應:

{ "token": "abcdefg" } 

然後你就可以提交此令牌與您的形式。由於這是一個單獨的請求,響應不會成爲緩存頁面的一部分。此方法唯一的缺點是必須啓用JavaScript才能檢索令牌。儘管您可能可以處理這種情況,但如果由於JavaScript被禁用而導致表單沒有標記而被張貼,則可以在將實際項目添加到購物車之前添加確認步驟。確認頁面將被設置爲不被緩存,因此每個用戶將始終爲其會話獲取令牌。

+0

這是否就像沒有任何CSRF令牌並依賴於相同的原始策略一樣?由於唯一可以保護'/ getCSRFToken'的方法是通過相同的原始策略,否則可以通過簡單地執行兩個帖子而不是一個帖子來安裝CSRF攻擊(第一篇文章是獲取CSRF令牌,第二個請求是攻擊請求),除非我錯過了關於如何保護'/ GetCSRFToken'的內容? –

+0

您無法檢索csrf攻擊中的值,只能發送它們。同源策略允許寫入,而不是讀取,因此爲什麼需要寫入CSRF緩解。通過寫我的意思是POST請求或其他'不安全'的方法。這是否回答你所問的? – SilverlightFox

+0

還是我誤解了你的問題?我猜這是你的失望? – SilverlightFox