2013-05-30 70 views
4

我有一個彈性web應用程序託管在亞馬遜上,我面臨來自某些自動化機器的登錄攻擊。從我的日誌中,很明顯他們正在繞過登錄頁面,並且正在使用類似於:防止來自curl/http post的登錄攻擊在春季應用程序

curl --data "j_username=xxx&j_password=yyy" http://www.mysecureurl.com/j_spring_security_check 

我的問題是如何防止此類攻擊。有沒有辦法阻止登錄頁面通過彈簧配置不直接進入的登錄?

當用戶嘗試登錄頁面時,我會執行進一步的安全措施,如驗證碼,三錯後鎖定等。

+1

你可以實現一個Spring AOP來檢查你的請求......例如:http://www.mkyong.com/spring/spring-aop-examples-advice/ – Rudy

+0

但是,如何訪問httprequest/session中的任何內容這之前的攔截器?我沒有線索。 – Supra

+1

在http://stackoverflow.com/questions/3310115/spring-aop-advice-on-annotated-controllers中關注espen答案(示例基於在spring控制器中實現建議)。請注意,該請求必須添加爲控制器簽名。 – Rudy

回答

3

您可以實施a Cross-site Request Forgery(CSRF) - 隨機數標記模式。

換句話說,

  • 產生隨機的令牌(對於每個用戶的不同)。
  • 把這個令牌在用戶會話
  • 在用戶登錄表單
  • 如果收到比校驗登錄請求所提交的令牌相匹配的令牌生成會話的添加它作爲一個隱藏字段 - 如果不是然後把他們一個接denid

BTW:

0

如果來自同一IP地址的所有請求,你可以使用hasIpAddress表達:

<security:intercept-url pattern="/secure" access="isAuthenticated() and !hasIpAddress('11.11.111.11')" /> 

更暫時的黑客,因爲攻擊可以改變他們的IP。

0

下面是我如何解決我的問題,感謝上述所有答案。

1.添加自定義過濾器,以我的春季安全: <custom-filter position="FORM_LOGIN_FILTER" ref="loginFilter" />

2.In登錄控制器,生成一個隨機字符串,並把在HTTP會話

String random = UUID.randomUUID().toString().toLowerCase().replaceAll("-", ""); 
request.getSession().setAttribute("userKeyInSession", random); 

3.Also通過這隨機鍵登錄頁面,以便登錄jsp可以提交這個隱藏參數以及表單提交。

model.addAttribute("userKey", random); 
return "login"; 

4.在LoginFilter中,我現在在請求參數和會話中的隨機值之間做一個簡單的字符串比較。如果它們不匹配,我拒絕並且不繼續進行認證。

更多操作:驗證碼等防止來自UI的攻擊..

-1

看起來您正在使用Spring-Security提供的默認請求登錄參數。 默認名稱屬性和密碼屬性值爲j_usernamej_password。 因此,如果您將您的登錄頁面的用戶名密碼參數名稱屬性設置爲特定於您的應用程序,那麼您將能夠避免此類攻擊,因爲在這種情況下,只有您將知道實際值屬性名稱和密碼,沒有其他人,因此沒有人能夠發送http hack請求給你的應用程序。

+0

知道param的名字是多麼困難,即使我改變他們反正..謝謝,但它不會幫助。 – Supra