2009-11-26 116 views
18

使用AntiForgeryToken需要每個請求都傳遞有效的令牌,所以使用簡單腳本將數據發佈到我的Web應用程序的惡意網頁將無法成功。ASP.NET MVC中的AntiForgeryToken是否可以防止所有CSRF攻擊?

但是如果惡意腳本,以下載包含在一個隱藏的輸入字段的防僞標記的頁面會先進行一些簡單的GET請求(由Ajax),提取它,並用它來進行有效的POST

這是可能的,還是我錯過了什麼?

回答

12

是的,這是你需要做的。

只要你生成每個受保護的網頁上一個新的令牌,用<%= Html.AntiForgeryToken() %> ,始終確保它在任何保護行動檢查,使用[ValidateAntiForgeryToken]

這實現了一個在CSRF Prevention Cheat Sheet在OWASP討論的同步標記模式。

爲了讓腳本成功地發出可接受的請求,它必須首先獲取表單並讀取令牌,然後發佈令牌。 Same Origin Policy將阻止它在瀏覽器中被允許。站點canot向另一個站點發送AJAX樣式的http請求;只對自己。如果由於某種原因可能違反同一起源政策,那麼您將變得脆弱。

請注意,如果您有跨站點腳本漏洞,攻擊者可以濫用xss漏洞繞過相同源策略提供的保護(因爲腳本現在從您自己的站點運行,所以SOP成功) 。注入的腳本然後可以愉快地閱讀並重新提交該令牌。這種通過XSS獲得CSRF保護的技術最近在一些蠕蟲中很常見。基本上,如果你有XSS,你的CSRF保護是浪費時間,所以確保你不容易受到任何影響。

另外需要注意的是Flash和Silverlight。這兩種技術都不會訂閱相同的來源策略,而是使用跨域策略文件來限制對遠程資源的訪問。如果您在自己的站點上發佈跨域策略xml文件,則Flash/Silverlight腳本只能訪問您站點上的資源。如果你確實發佈了這個文件,只允許一個受信任的第三方服務器的白名單,並且絕不允許*。

瞭解更多關於CSRF at OWASP 參見:XSS Prevention Cheat Sheet

+1

所以除了驗證令牌之外,還必須小心crossdomain.xml,對嗎?如果我理解正確,公開Web應用程序以獲取不受限制的跨域請求(allow-http-request-headers-from crossdomain.xml中的domain =「*」),這是否違反了AntiForgeryTokens的目的,並使站點CSRF易受攻擊? – PanJanek 2009-11-27 06:59:11

+0

是的。如果您在服務器上發佈crossdomain.xml策略文件,您可以重新開放自己以適應通過遠程Flash動畫中的ActionScript製作的CSRF攻擊。如果你發佈這個文件只會將受信任的第三方列入白名單而永遠不會*。我會將其添加到答案 – Cheekysoft 2009-11-27 12:36:58

+1

「一個網站canot向另一個網站發出AJAX樣式http請求;僅限於自己」 那麼Google Analytics(分析)是如何工作的? 我認爲相同來源政策與無法閱讀/修改其他網站的Cookie有關。 – 2010-08-09 20:40:16

3

但是如果惡意腳本將首先以下載包含隱藏的輸入字段防僞標記的網頁一些簡單的GET請求(阿賈克斯),提取它,並使用它來使有效的POST?

是的,這是事實,但是,如果它不是在瀏覽器中結束了這不是一個CSRF攻擊。

如果它不結束它的瀏覽器(例如,通過在服務器端代碼中的HTTP請求刮),那麼會發生什麼刮代碼將得到一個CSRF令牌。但是你合法的,經過驗證的用戶將獲得不同的令牌把自己的機器上。由於是,上述刮板提升令牌是不同的,以發行給用戶的一個,則POST將失敗。

如果你想阻止非瀏覽器腳本決策職位,那麼你需要採取另一種方法來驗證它的人。

+0

通過使用AJAX進行GET請求,我的意思是GET通過嵌入在某個頁面中的惡意腳本執行,該頁面在瀏覽器中由用戶以某種方式打開以打開此頁面。這樣腳本就會在用戶的上下文中執行。所以我認爲它仍然是CSRF。 – PanJanek 2009-11-27 13:36:33

+0

啊我明白了。那麼這是不會工作的,因爲相同的原始策略,除非他們做了一些棘手的事情,在這種情況下cookie不會流動,所以令牌會不同 – blowdart 2009-11-27 17:52:57