2017-10-18 11 views
0

스프링 보안을 사용하여 DNS 리 바인딩 공격으로부터 웹 애플리케이션을 보호 할 수 있습니까? 그리고 동일한 종류의 공격으로부터 서버를 보호하기 위해 Glassfish 4.1을 구성하는 방법은 무엇입니까? Host 헤더가 서버의 DNS 이름과 일치하지 않지만 예제 코드를 찾을 수없는 경우 모든 http 연결을 차단하여이 문제를 해결할 수 있다고 읽었습니다.스프링 보안을 사용하여 Anti DNS Pinning (DNS 리 바인딩) 방어를 구축하는 방법은 무엇입니까?

답변

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으로 응답합니다. 그렇지 않으면 요청이 정상적으로 실행됩니다.

같은 web.xml을 통해 일하는 것이 일반적인 JSF 웹 응용 프로그램에서 필터 등록 :

<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> 

을 스프링 기반 응용 프로그램에서이 구성 클래스에서이처럼 등록 할 수 있어야한다 :

@Bean 
public FilterRegistrationBean filterRegistrationBean2() { 

    FilterRegistrationBean registration = new FilterRegistrationBean(); 
    registration.setFilter(new DNSHostFilter()); 
    registration.addUrlPatterns("/*"); 

    return registration; 
}