4

我有一个托管在亚马逊上的 Spring Web 应用程序,我正面临来自一些自动化机器的登录攻击。从我的日志中,很明显他们正在绕过登录页面,并且正在使用类似的东西:

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

我的问题是如何防止此类攻击。有没有办法可以通过一些弹簧配置阻止不直接来自登录页面的此类登录?

然后,当用户从登录页面尝试时,我将实施进一步的安全措施,如验证码、3 次错误尝试后锁定等。

4

4 回答 4

3

您可以实现跨站点请求伪造(CSRF)-Nonce-Token Pattern。

换句话说,

  • 生成一个随机令牌(每个用户都不同)。
  • 将此令牌放入用户会话中
  • 将其添加为用户登录表单中的隐藏字段
  • 如果您收到登录请求,则检查提交的令牌是否与会话中的令牌匹配 - 如果不匹配,则向他们发送拒绝访问

顺便提一句:

于 2013-05-30T07:46:26.787 回答
0

如果所有请求都来自同一个 IP 地址,您可以使用hasIpAddress表达式:

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

这是更临时的黑客攻击,因为攻击者可以更改他们的 IP。

于 2013-05-30T08:53:00.250 回答
0

感谢以上所有答案,这是我解决问题的方法。

1.为我的spring security添加了一个自定义过滤器: <custom-filter position="FORM_LOGIN_FILTER" ref="loginFilter" />

2.在登录控制器中,生成一个随机字符串并将其放入http会话中

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

3.还将这个随机密钥传递给登录页面,以便登录jsp可以将其作为隐藏参数与表单提交一起提交。

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

4.在 LoginFilter 中,我现在对请求参数和会话中的随机值进行简单的字符串比较。如果它们不匹配,我拒绝并且不继续进行身份验证。

更多工作:验证码等,用于现在防止来自 UI 的攻击..

于 2013-07-04T11:07:56.837 回答
-1

看起来您正在使用 Spring-Security 提供的默认请求登录参数。默认名称属性和密码属性值为j_usernamej_password。因此,如果您将登录页面的用户名密码参数名称属性更改为特定于您的应用程序,那么您将能够避免此类攻击,因为在这种情况下,只有您知道实际值属性名称和密码,而没有其他人知道因此没有人能够向您的应用发送 http hack 请求。

于 2013-09-21T13:41:12.107 回答