如何使用Spring Security构建Anti DNS Pinning(DNS重新绑定)防御?

时间:2017-10-18 12:38:59

标签: spring security dns glassfish

是否可以使用Spring Security保护Web应用程序免受DNS重新绑定攻击?以及如何配置Glassfish4.1以保护服务器免受同类攻击? 我已经读过,如果主机头与服务器的DNS名称不匹配,但是找不到任何示例代码,可以通过阻止所有http连接来解决这个问题。

1 个答案:

答案 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;
}