【发布时间】:2018-06-01 10:47:42
【问题描述】:
我们的项目存在安全问题。攻击者可以拦截登录请求并修改其中的“主机”标头。服务器将响应重定向 (303),将用户发送到可能是邪恶的站点。
是否可以为重定向添加白名单?
使用带有嵌入式 tomcat 的 Spring-boot,在生产中这整个事情将在负载均衡器之后。
@Override
protected void configure(HttpSecurity http) throws Exception {
http //@formatter:off
.formLogin()
.loginProcessingUrl("...")
.usernameParameter("...")
.passwordParameter("...")
.loginPage("/").permitAll()
.successHandler(authenticationSuccessHandler)
.failureHandler(authenticationFailureHandler)
.and().logout().permitAll()
.logoutSuccessHandler(logoutSuccessHandler)
.deleteCookies(XSRF_TOKEN, JSESSIONID)
.and().authorizeRequests()
.antMatchers("...").permitAll().anyRequest().authenticated()
.and().csrf().csrfTokenRepository(csrfTokenRepository)
.and().addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint);//@formatter:on
}
到目前为止,我已经尝试了以下方法:
- 使用
TomcatEmbeddedServletContainerFactory并在那里添加阀门。 - 使用
FilterRegistrationBean和RemoteAddrFilter.setDeny()。
1° 选项根本不会启动。我显然在某个地方犯了错误,但很难找到这些信息,而且我不知道该怎么做。
我在Stackoverflow 上找到的 2° 选项,感觉是正确的做法,但我未能成功。如果setDeny() 存在,它甚至不会让我进入我的网站。如果我将其注释掉,那么看起来根本没有过滤发生。 bean 看起来像这样:
@Bean
public FilterRegistrationBean remoteAddressFilter() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
RemoteAddrFilter filter = new RemoteAddrFilter();
filter.setDeny("attacker/.com.*");
filter.setDenyStatus(404);
filterRegistrationBean.setFilter(filter);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
提前感谢您的任何帮助。
【问题讨论】:
-
攻击者可以拦截登录请求并修改您可以使用 HTTPS 来解决这个问题。
-
服务器将响应重定向 (303),将用户发送到可能是邪恶的站点。 为什么您的服务器将用户发送到邪恶的站点?重定向在您的处理程序中配置。
-
是否可以为重定向添加白名单? 在客户端站点上?为什么要更改服务器代码以在客户端站点上实现白名单?
-
RemoteAddrFilter#setDeny应该如何帮助您?您是否阅读过此方法的文档?顺便说一句:你确定它也适用于 DNS 名称吗? -
@dur 重定向在您的处理程序中配置。我该如何配置它们? Spring security 只返回 303,仅此而已。 在客户网站上?为什么要更改服务器代码以在客户端站点上实现白名单? 不,它是通过重定向响应的服务器。请求离开前端,被拦截,修改后发送到服务器,返回303。你看过这个方法的文档吗?是的,我觉得它没有描述性。
标签: java spring-boot tomcat spring-security