2015-11-12 30 views
2

我需要實現一個解決方案來防止基於struts 1框架的應用程序中的CSRF攻擊。 在網絡上,人們認爲這些類型的解決方案:安全性:在struts中實施針對CSRF攻擊的解決方案1 ​​

  • 的Struts saveToken(請求)和isTokenValid(請求,真)
  • 庫,如HDIV和OWASP CSRFGuard

目前我不」不知道哪一個最適合這個問題。 所以,你可以給我你對這些解決方案的意見,以指導我的選擇,如果可能的話用 的例子或建議其他解決方案。

感謝您的幫助

回答

0

使用HDIV可以防止CSRF攻擊,而不僅僅是這樣。你可以避免90%的OWASP Top 10.所以,如果你想開發一個更安全的軟件,我建議你使用HDIV。

CSRFGuard是防止CSRF的好庫,但僅限於此。如您所知,學習多種產品需要時間,在這種情況下,如果您可以避免更多類型的攻擊,則更完整的解決方案會更好。

關於Struts saveTokenisTokenValid方法,我想也一樣。這是一個有限的功能,我會使用更完整的產品。

1

如果您只關注CSRF而不關注其他OWASP安全問題,那麼我建議您使用支持的Struts,即Synchronizer Token Pattern,而不是使用任何外部庫。

來自Struts Survival指南的Synchronizer模式摘錄。

要了解Synchronizer Token的工作方式,需要在Action類中包含一些關於 內置功能的背景知識。該行動 類有),它的邏輯如下稱爲saveToken(方法:

HttpSession session = request.getSession(); 
String token = generateToken(request); 
if (token != null) { 
session.setAttribute(Globals.TRANSACTION_TOKEN_KEY, token); 
} 

的方法,使用一個MessageDigest並將其存儲在所述會話的會話ID,當前時間和 使用密鑰名稱來生成隨機令牌 org.apache.struts.action.TOKEN(這是org.apache.struts.Globals類中的靜態 變量TRANSACTION_TOKEN_KEY的值。 Action類將呈現表單的調用saveToken()方法調用到 創建會話屬性與上述名稱在JSP中,您有 將令牌用作隱藏表單字段,如下所示:

<input type="hidden" 
name="<%=org.apache.struts.taglib.html.Constants.TOKEN_KEY%>" 
value="<bean:write name="<%=Globals.TRANSACTION_TOKEN_KEY%>"/>"> 

嵌入式<豆:寫>如上所示標籤,將查找名爲 org.apache.struts.action.TOKEN(這是全局的值豆。 TRANSACTION_TOKEN_KEY),並將其值作爲隱藏輸入變量的 值屬性呈現。隱藏的 輸入變量的名稱是org.apache.struts.taglib.html.TOKEN(這不是 ,而是類 org.apache.struts.taglib.html.Constants中的靜態變量TOKEN_KEY的值)。當客戶提交 表單時,隱藏字段也會被提交。在處理 表單提交(很可能與呈現表單的動作 不同)的操作中,通過使用isTokenValid()方法將表單提交中的標記與會話中的標記進行比較 。方法 比較這兩個標記,如果兩者相同,則返回true。確定在isTokenValid()方法中通過reset =「true」以在比較之後清除會話中的令牌 。如果這兩個標記相同,則首次提交 表單。但是,如果這兩個標記確實不匹配,或者會話中沒有標記,則表示 重複提交,並以您的 用戶可以接受的方式處理。