2017-09-24 106 views
0

我正在開發一個應該非常安全的java web應用程序,因此我在SSL服務器上啓用了CSRF的spring security和spring MVC;我使用POST提交所有表單,併成功提交生成的CSRF令牌,但是有些頁面具有GET方法,如果有攻擊者從任何瀏覽器打開任何頁面的源代碼,他可以在Form標記中看到生成的CSRF令牌,那麼他可以使用它會發布任何內容到我們的網站,只要該會話在用戶攻擊下處於活動狀態!我對嗎?Spring Security和CSRF攻擊

我該做什麼使網站非常安全?我是否應該使用其他任何開源軟件以及Spring安全套件來支持其他攻擊,如跨站點腳本等。我應該強制所有頁面使用POST來避免任何CSRF攻擊?

UPDATE

我試圖爲登錄用戶提交通過使用同樣的道理相同會話下相同的瀏覽器客戶端工具的要求做更多的測試,但它失敗,則迴應稱登錄失敗,和報頭包含nosniff

X-Content-Type-Options: nosniff 
X-XSS-Protection: 1; mode=block 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 
X-Frame-Options: DENY 

所以我覺得它使用GET春季安全處理CSRF不害怕從某一個讀取GET頁面的標記,除非攻擊者使用XSS攻擊做提交安全

回答

3

攻擊者可以看到他自己的CSRF令牌,但他看不到其他用戶的CSRF令牌。不同的用戶有不同的令牌,並且使用錯誤的令牌應該不起作用。

所以這裏沒什麼可擔心的。不要驚慌。

+0

如果攻擊者在受害者會話處於打開狀態時(例如,顯示讀取某些GET頁面的Ad)的腳本來讀取GET頁面,他可以讀取該頁面的敏感數據,並且可以在該內部的任何POST動作內竊取該令牌頁面並用它來執行POST操作。 –

+0

@HanySak​​r,是的,但是如果攻擊者可以發佈腳本,那麼CSRF是他腦海中最後一件事情之一。在這種情況下,他會做更多其他更嚴肅和直接的事情,例如放棄[JavaScript關鍵記錄器](https://wiremask.eu/articles/xss-keylogger-turorial/)來竊取用戶密碼。可以這樣思考:CSRF以逐個用戶爲基礎工作,但跨站點腳本一次攻擊許多用戶。跨站點腳本比CSRF更危險。 – TheGreatContini

+0

感謝您的回覆。實際上,我需要關閉任何攻擊的大門,我已經處理了跨站點腳本,並且在想如果我可以將所有頁面更改爲POST,而不是GET,它將完全覆蓋CSRF,並且不會允許任何人猜測生成的令牌。 我看到了一個解決方案,可以爲HDiv等每個頁面生成標記,但是我不知道它是否與彈簧安全性集成在一起? –

0

但是某些頁面出現GET方法,如果任何攻擊者從任何瀏覽器中打開的任何網頁的 來源,他可以看到表單標籤內所產生的CSRF 令牌,那麼他就可以用它來任何內容POST到 我們的網站只要會話在用戶攻擊下處於活動狀態! 我對嗎?

是的你是對的,使用GET會讓你的網站泄露敏感信息。這正是爲什麼Spring SecurityRFC Specification不鼓勵使用GET請求發送敏感信息的原因。如果您發送CSRF令牌,則應該POST。

我應該怎麼做使網站非常安全?我是否應該使用任何其他開源的 以及spring安全來支持其他攻擊,如 跨站腳本等。

Spring Security框架不是Silver Bullet。使用它不會神奇地使您的Web應用程序100%安全。儘管它涵蓋了大部分安全漏洞,但我們必須確保以不引入任何漏洞的方式進行編碼。

例如:

在跨站腳本,即使你使用Spring Security,如果你把從一個HTML輸入框的值,並將其直接保存而不HTML編碼,並在JSP顯示回來的情況下像${value}文件,你會介紹XSS的可能性。

+0

感謝Shazin,但我沒有通過GET更改服務器的狀態,我只是使用POST來提交表單,所以CRSF標記永遠不會出現在URL上。 我只想使用GET從服務器檢索信息,例如列表中的某些操作,以便用戶可以使用POST提交操作。這裏頁面本身的問題是GET,所以攻擊者可以加載它並打開源代碼並獲得令牌;所以在這種情況下,我應該保留所有頁面作爲POST!是對的嗎 !! –