Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring MVC web应用程序检测暴力攻击的最佳方法?_Java_Security_Spring_Spring Mvc_Spring Security - Fatal编程技术网

Java Spring MVC web应用程序检测暴力攻击的最佳方法?

Java Spring MVC web应用程序检测暴力攻击的最佳方法?,java,security,spring,spring-mvc,spring-security,Java,Security,Spring,Spring Mvc,Spring Security,Spring 3.0 MVC中是否有任何功能可以帮助检测web应用程序的身份验证/登录页面上的暴力攻击?令人惊讶的是,我在参考文档中找不到任何关于或的内容 然而,我确实发现它描述了如何使用进行验证。久经验证的做法是在验证失败时引入随机但相当大的延迟 通过这种方式,合法用户将立即登录,但攻击者每次尝试将花费500毫秒到1秒,这使得整个暴力想法不切实际(将永远无法实现) 合法用户偶尔登录失败只会造成轻微延迟,不会引起注意 如果您需要收到关于重复失败登录的通知,则需要实现报告打印每个用户相应失败登录的

Spring 3.0 MVC中是否有任何功能可以帮助检测web应用程序的身份验证/登录页面上的暴力攻击?

令人惊讶的是,我在参考文档中找不到任何关于或的内容


然而,我确实发现它描述了如何使用进行验证。

久经验证的做法是在验证失败时引入随机但相当大的延迟

通过这种方式,合法用户将立即登录,但攻击者每次尝试将花费500毫秒到1秒,这使得整个暴力想法不切实际(将永远无法实现)

合法用户偶尔登录失败只会造成轻微延迟,不会引起注意

如果您需要收到关于重复失败登录的通知,则需要实现报告打印每个用户相应失败登录的数量,按该数量订购desc limit 100


附言是一篇解释如何在登录尝试时得到通知的帖子。我相信,按照同样的方法可以引入延迟。

简单的答案是否定的,据我所知,Spring 3.0 MVC没有任何东西可以帮助您检测暴力攻击。我不相信SpringSecurity3.0在这方面有任何东西

但是,您应该能够通过扩展一些UserDetails服务来自己实现一些东西

有时建议记录所有登录尝试,无论成功与否。如果您正在记录所有故障(如在数据库中),您应该能够确定是否有人/某事试图对您的站点进行暴力攻击


你应该考虑扼要的登录尝试,如@ Yang-YangBug的描述。

也考虑将CAPTCHA添加到你的登录页面,ReCPTHA从谷歌很容易集成到任何应用程序。是用于Java/JSP的文档

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

顺便说一句,我不建议在可疑的无效登录测试前延迟。您可能会延迟响应可疑的登录尝试,但这种延迟会导致应用程序中的线程暂停一段时间。如果您的应用程序同时发生大量无效登录,这可能会在您的系统上提供DoS或DDoS攻击

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

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

  • 显示一些验证码
  • 暂停帐户、向帐户所有者发送电子邮件或短信以更改密码
  • 或者,暂停帐户一段时间,同时通知帐户所有者更改密码
所有这些都取决于您的域和服务场景。 例如,您可以实现自己的UserDetailsService,并在此实现中检测暴力攻击

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

}

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

@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);
}}

这取决于你的环境。当您控制服务器环境并记录所有登录尝试时,您可以使用fail2ban。或者,您只需在身份验证提供程序中编写类似于fail2ban的内容,或者请求FilterGood idea。我认为,人们甚至可以像某些操作系统那样以指数方式增加延迟时间。
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);
}
@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);
}}
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;
    }
}