2010-12-16 5 views
8

Java 기반 Spring 웹 응용 프로그램에서 크로스 사이트 스크립팅 (XSS)을 방지하기 위해 노력하고 있습니다. 이 예제와 비슷한 서블릿 필터를 이미 구현했습니다. http://greatwebguy.com/programming/java/simple-cross-site-scripting-xss-servlet-filter/은 모든 입력을 애플리케이션에 위생 처리합니다. 추가 보안 수단으로 모든 JSP에서 응용 프로그램의 모든 출력을 위생적으로 처리하고 싶습니다. 나는 이것이 어떻게 행해지는지보기 위해 약간의 연구를 해왔고 두 가지 보완적인 선택을 발견했다.XSS를 방지하기 위해 c : out을 사용하는 대신

그 중 하나는 스프링의 defaultHtmlEscape 속성을 사용하는 것입니다. 이것은 구현하기가 매우 쉽습니다 (web.xml의 몇 줄). 출력이 봄 태그 (예 : 메시지 또는 양식 태그) 중 하나를 통과 할 때 훌륭하게 작동합니다. 내가 찾은 다른 옵션은 그러나 때문에 I가 (200 개 + JSP 파일) 작업하고있는 응용 프로그램의 크기로, 직접적으로 ${...} 같은 EL 표현식을 사용하는 대신 두 번째 방법은 완벽하게 작동 <c:out value="${...}" />

을 사용하는 것입니다. EL 표현의 부적절한 사용을 모두 c:out 태그로 대체해야하는 것은 매우 번거로운 작업입니다. 또한 앞으로 모든 개발자가 c:out 태그를 사용하는이 규칙에 충실하도록하는 것은 번거로운 작업이 될 것입니다 (코드가 얼마나 더 읽을 수 있을지는 말할 것도 없습니다).

적은 수의 코드 수정이 필요한 EL 식의 출력을 이스케이프 처리 할 수있는 다른 방법이 있습니까?

답변

10

서블릿 2.5/JSP 2.1 이후로 사용자 정의 ELResolver을 만들 수 있습니다. ServletContextListener#contextInitialized()에 등록 할 수 있습니다.

@Override 
public void contextInitialized(ServletContextEvent event) { 
    JspFactory.getDefaultFactory() 
     .getJspApplicationContext(event.getServletContext()) 
     .addELResolver(new YourCustomELResolver()); 
} 

ELResolver#getValue()에서 탈출 작업을 할 수 있습니다.

유일한 문제는 허용 된 곳에서 HTML을 표시 할 수 없다는 것입니다. 즉, 허용 목록의 종류별로 악의적 인 태그/속성에서 이미 위생 처리되어 있으므로 Jsoup can과 같은 무해한 태그로 끝납니다. 말했다


, 난 당신이 질문의 첫 번째 단락에서 언급 Filter에 의해 입력 동안 XSS를 탈출하는 필요성을 동의하지 않는다. 이중 탈출의 위험이 있습니다. HTML에서 정확히 인라인 될보기 측면에서 곧바로 해가 될 수있는 지점, 즉 출력이 인 지점에서 정확히 이스케이프해야합니다. 그 소위 XSS 필터를 없애고보기 측면에서 JSTL <c:out> 또는 fn:escapeXml() (또는 사용자 정의 EL 해결 프로그램을 사용하여 해결하는 것이 좋습니다.하지만 이는 일반적인 방법이 아닙니다.) 미래의 코드 관리자는 큰 감사를 표할 것입니다.

+1

HTML을 이스케이프 처리하기 위해'fn : escapeXml'을 사용하지 마십시오.표준 HTML 엔티티가 아닌 '''을 생성합니다. –

+1

@Roland : 아니요, 그렇지 않습니다. '''을 생성하고 HTML과 XML 모두에서 유효합니다 ('c : out'도 마찬가지입니다). – BalusC

+0

아, 훌륭합니다. 그래서 나는 다른'escapeXml' 함수와 혼동을 불러 일으켰을 것이다. 확실하게, JSTL 명세에서이를 찾아 보았다. 명시 적으로 언급했다. –

1

This blog post은 String 유형의 EL 표현식 값을 이스케이프하는 사용자 정의 ELResolver를 설명합니다. 이 사용자 정의 ELResolver를 등록하면 모든 EL 표현식의 출력을 이스케이프 (escape)하게됩니다.

<%= "Java expression hopefully returning safe HTML" %> 
1

난 당신이 C를 사용할 필요가 없습니다 동의는 JSP, 당신은 사용자 정의 태그 나 스크립틀릿 등의 EL 표현식을 포함하지 않는 메커니즘을 프로그래밍 방식으로 출력 HTML을 요구해야하는 예외적 인 경우에 : 모든 변수 주위에. 이유를 설명하는 블로그를 작성했습니다. http://tech.finn.no/2011/04/08/xss-protection-whos-responsibility/

많은 부분이 여기에 나와 있습니다.

관련 문제