是否可以使用Spring Security保护Web应用程序免受DNS重新绑定攻击?以及如何配置Glassfish4.1以保护服务器免受同类攻击? 我已经读过,如果主机头与服务器的DNS名称不匹配,但是找不到任何示例代码,可以通过阻止所有http连接来解决这个问题。
答案 0 :(得分:0)
是的,你可以使用扩展javax.servlet.Filter
的类,你可以手动检查“主机”标题,这是一个例子:
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DNSHostFilter implements Filter {
@Override
public void init(FilterConfig fc) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
String header = servletRequest.getHeader("Host");
if (!header.contains(servletRequest.getLocalAddr())) {
servletResponse.sendError(401);
} else {
fc.doFilter(request, response);
}
}
@Override
public void destroy() {}
}
重要提示:您必须检查方法servletRequest.getLocalAddr()
是否返回服务器的正确IP,否则您只需将IP作为字符串插入(但这不是很灵活)
该示例非常简单,如果“Host”标头不包含您的服务器IP,那么它将使用HTTP 401进行响应,否则请求正常执行。
在普通的JSF Web应用程序中注册过滤器可以通过web.xml
运行,如下所示:
<filter>
<filter-name>DNSHostFilter</filter-name>
<filter-class>your.package.DNSHostFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>DNSHostFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
在基于Spring的应用程序中,应该可以在配置类中注册它:
@Bean
public FilterRegistrationBean filterRegistrationBean2() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new DNSHostFilter());
registration.addUrlPatterns("/*");
return registration;
}