首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring MVC web应用检测暴力破解攻击的最佳方式是什么?

Spring MVC web应用检测暴力破解攻击的最佳方式是什么?
EN

Stack Overflow用户
提问于 2011-04-16 20:37:47
回答 5查看 6K关注 0票数 17

Spring3.0MVC中有没有什么特别的特性可以帮助在web应用的身份验证/登录页面上实现暴力破解攻击的检测?

EN

回答 5

Stack Overflow用户

发布于 2011-04-16 22:08:53

久经考验的实践是,如果身份验证失败,则会引入随机但相当大的延迟。

通过这种方式,合法用户将立即登录,但攻击者每次尝试将花费500ms-1s,这使得整个暴力破解的想法不切实际(将永远花费时间)。

合法用户偶尔登录失败只会造成很小的延迟,并且不会被注意到。

如果需要在重复失败的登录时通知您,您需要实现一个报告,打印每个用户的相应失败登录次数,并按该次数排序,说明限制为100。

P.S. Here是一篇解释如何在登录尝试时获得通知的帖子。我相信,遵循同样的方法可以引入延迟。

票数 14
EN

Stack Overflow用户

发布于 2015-03-31 20:57:17

通过Spring安全中的一些配置和编码,这是可能的。

顺便说一句,我不建议在可疑的无效登录试验前进行一些延迟。您可能会延迟响应可疑的登录尝试,但这种延迟会让您在应用程序中挂起线程一段时间。如果大量无效登录同时发生在您的应用程序中,这可能会对您的系统造成DoS或DDoS攻击。

更好的方法是对可疑的无效登录做出快速响应,但同时暂停用户尝试登录的用户帐户。以这种方式,暴力攻击避免不会导致提供Dos或DDoS攻击。

然而,暂停用户帐户也会为DoS攻击提供一种方式,因为它可能导致无法向真实用户提供服务。但是,在这些情况下,正确的安全场景会很有帮助。例如,如果检测到暴力破解攻击,您可以:

  • 显示一些验证码,
  • 暂停帐户,电子邮件或短信帐户所有者的密码更改
  • 或,暂停帐户一段时间,同时通知帐户所有者密码更改,
  • ...

所有这些都取决于您的域和服务场景。例如,您可以实现自己的UserDetailsService并在此实现中检测暴力破解攻击。

为了通过Spring Security实现最后一个场景,下面的代码声明了一个身份验证管理器,它被传递了一个自定义的UserDetailsService,这里的类型是JdbcDaoImpl (请注意,包名和查询必须修改为您自己的包和数据模型)。

代码语言:javascript
复制
<authentication-manager alias="authenticationManager" xmlns="http://www.springframework.org/schema/security">
    <authentication-provider user-service-ref="CustomUserDetailsService" />           
</authentication-manager>

<!--
This bean is to provide jdbc-user-service.
Also, it provides a way to avoid BFD along with AuthenticationFailureListener
-->
<bean id="CustomUserDetailsService" class="com.example.CustomUserDetailsService">
    <property name="dataSource" ref="dataSource" />
    <property name="usersByUsernameQuery" value="SELECT user_client.user_name, user_client.password, user.is_active
                                   FROM user_client INNER JOIN user ON user_client.fk_user = user.ID
                                   WHERE user_client.user_name=? "/>
    <property name="authoritiesByUsernameQuery" value="SELECT user_client.user_name, CONCAT('ROLE_',user_client.client_id)
                                   FROM user_client WHERE user_client.user_name=? "/>
</bean>

CustomUserDetailsService检测是否发生了暴力破解攻击,以及我稍后将讨论的AuthenticationFailureListener。FailedLoginCacheManager是一个ehcache包装器,它维护失败的登录(用户名)及其相对失败的数量。缓存设置了适当的timeToIdleSeconds,以使帐户暂停为临时。

代码语言:javascript
复制
public class CustomUserDetailsService extends JdbcDaoImpl {

@Autowired
private FailedLoginCacheManager cacheManager;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    if (cacheManager.isBruteForceAttackLogin(username)) {
     //throw some security exception
     ...
    }
    return super.loadUserByUsername(username);
}

}

此外,还实现了ApplicationListener来检测失败的登录尝试,并将其保存在ehcache中。

代码语言:javascript
复制
@Component public class AuthenticationFailureListener implements ApplicationListener<AuthenticationFailureBadCredentialsEvent> {

@Autowired
private FailedLoginCacheManager cacheManager;

@Override
public void onApplicationEvent(AuthenticationFailureBadCredentialsEvent event) {
    UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) event.getSource();
    String userName = token.getPrincipal().toString();
    cacheManager.updateLoginFailureStatus(userName);
}}

不需要更多地讨论FailedLoginCacheManager服务,但这里讨论的两个主要方法可以像以下方法一样实现:

代码语言:javascript
复制
public void updateLoginFailureStatus(String userName) {
    Cache cache = manager.getCache(CACHE_NAME);

    Element element = cache.get(userName);
    if (isValid(element)) {
        int failureCount = (Integer)element.getObjectValue();
        cache.remove(userName);
        cache.put(new Element(userName, ++failureCount));
    } else {
        cache.put(new Element(userName, 1));
    }

}

public boolean isBruteForceAttackLogin(String username) {
    Cache cache = manager.getCache(CACHE_NAME);
    Element element = cache.get(username);
    if (isValid(element)) {
        int failureCount = (Integer)element.getObjectValue();
        return failureCount >= 3;
    } else {
        return false;
    }
}
票数 4
EN

Stack Overflow用户

发布于 2011-04-16 21:21:50

令人惊讶的是,我在参考文档中找不到任何关于Spring MVCSpring Security的东西。

不过,我确实找到了描述如何使用Splunk完成此任务的this 3 year old tutorial

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5686531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档