2010-10-29 160 views
1

我使用Rails request_forgery_protection機制來保護我的POST操作免受CSRF攻擊和驗證碼以保護GET操作。這樣,如果有人在一個會話中進行兩階段攻擊,用當前令牌獲取表單,然後用該令牌發送僞造請求,他最終將面臨驗證碼檢查。rails csrf令牌生存期

雖然我堅持這樣做,因爲Rails直到會話結束才重新生成CSRF令牌。這對我來說看起來不太合適,我認爲在下一個動作之前應該更新令牌。我在想,也許我調整了一些錯誤?有沒有另外一種方法呢?

謝謝。

回答

0

如果不爲每個頁面請求重新生成表單令牌,這種保護是不好的。我前一段時間遇到過這個問題(測試Redmine時,它是基於RoR的),並報告了這個問題,但沒有重新測試。

如果還沒有重新生成,我建議你向RoR團隊報告。

+0

我很高興我們同意一個持久性的標記是沒用的:)雖然RoR團隊修復了它,但我真的不明白它如何在沒有對網站架構施加嚴重限制或在安全性方面留下空白的情況下工作。恐怕我不得不依靠驗證碼。 – krukid 2010-11-08 20:42:45

+1

請注意,爲每個請求重新生成標記對可用性有一定影響(例如,返回不起作用),請參閱:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)_Prevention_Cheat_Sheet#General_Recommendation %3a_Synchronizer_Token_Pattern – hellvinz 2014-02-04 11:00:48

1

我不確定這是不是一個好主意,但是你可以在你的應用程序控制器中獲取請求時自行清除令牌。

before_filter :reset_csrf 


private 
def reset_csrf 
    session[:_csrf_token] = nil if request.get? 
end 
+1

我的想法,除了你不能使用它,如果你的網頁發送多個AJAX GET請求(例如用戶狀態更新),所以我會去「...如果request.get?而不是request.xhr? 」。唉,我不能,因爲如果你在兩個選項卡上都有表單並打算使用它們,那麼這種方法仍然會打破多標籤(多窗口)導航。除了XHR可以很容易被欺騙,這將爲稍微聰明的攻擊者留下一個安全漏洞。我開始認爲CSRF保護不起作用。 – krukid 2010-11-02 09:01:22

+0

是的,我知道你最後的意思。對不起,我沒有更多的建議,提供CSRF – jwarchol 2010-11-03 03:53:46

+0

我也得到這一點,保持多個標籤工作是重要的。我的安全知識很少報告一些事情。我使用一個非常微弱的JS驗證碼,只是爲了阻止垃圾郵件機器人:http://fabianosoriani.wordpress.com/2011/06/15/very-simple-invisible-javascript-rails-captcha/ – 2011-08-01 15:31:29