2013-05-30 28 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