복붙노트

[SPRING] XSS를 방지하기 위해 c : out을 사용하는 대신

SPRING

XSS를 방지하기 위해 c : out을 사용하는 대신

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

그 중 하나는 Spring의 defaultHtmlEscape 속성을 사용하는 것이다. 이는 구현하기가 매우 쉽습니다 (web.xml의 몇 줄). 출력이 봄 태그 (예 : 메시지 또는 양식 태그) 중 하나를 통과 할 때 잘 작동합니다. 내가 찾은 다른 옵션은 $ {...}와 같은 EL 표현식을 직접 사용하지 않고 대신 를 사용하는 것입니다.

두 번째 접근법은 완벽하게 작동하지만, 현재 작업하고있는 응용 프로그램의 크기 (200 개 이상의 JSP 파일) 때문에 발생합니다. EL 표현의 부적절한 사용을 c : out 태그로 대체해야하는 것은 매우 번거로운 작업입니다. 또한 앞으로는 모든 개발자가 c : out 태그를 사용하는이 규칙에 충실하도록하는 것이 번거로운 작업이 될 것입니다 (코드가 얼마나 더 읽을 수 있을지는 말할 것도 없습니다).

더 적은 수의 코드 수정을 요구하는 EL 표현식의 출력을 피할 수있는 또 다른 방법이 있습니까?

해결법

  1. ==============================

    1.Servlet 2.5 / JSP 2.1부터는 그렇게하는 커스텀 ELResolver를 만들 수 있습니다. ServletContextListener # contextInitialized ()에 등록 할 수 있습니다.

    Servlet 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과 같은 무해한 태그로 끝납니다).

    즉, 질문의 첫 번째 단락에서 언급 한 것처럼 필터가 입력하는 동안 XSS를 탈출 할 필요성에 동의하지 않습니다. 이중 탈출의 위험이 있습니다. HTML, 출력 사이에서 인라인 될보기 측면에서 곧바로 해를 끼칠 수있는 지점에서 벗어나기 만하면됩니다. 그 소위 XSS 필터를 제거하고 JSTL 또는 fn : escapeXml () (또는 사용자 정의 EL 해결 프로그램)을 사용하여보기 측면에서 수정하는 데 집중할 것을 권장합니다. 그러나 이것은 분명히 정상적인 것이 아닙니다. 접근). 미래의 코드 관리자는 대단히 감사 할 것입니다.

  2. ==============================

    2.이 블로그 게시물은 String 유형의 EL 표현식 값을 이스케이프하는 사용자 정의 ELResolver를 설명합니다. 이 사용자 정의 ELResolver를 등록하면 모든 EL 표현식의 출력을 이스케이프 (escape)하게됩니다. JSP에서 프로그래밍 방식으로 HTML을 출력해야하는 예외적 인 경우에는 사용자 정의 태그 또는 스크립틀릿과 같은 EL 표현식을 포함하지 않는 메커니즘이 필요합니다.

    이 블로그 게시물은 String 유형의 EL 표현식 값을 이스케이프하는 사용자 정의 ELResolver를 설명합니다. 이 사용자 정의 ELResolver를 등록하면 모든 EL 표현식의 출력을 이스케이프 (escape)하게됩니다. JSP에서 프로그래밍 방식으로 HTML을 출력해야하는 예외적 인 경우에는 사용자 정의 태그 또는 스크립틀릿과 같은 EL 표현식을 포함하지 않는 메커니즘이 필요합니다.

    <%= "Java expression hopefully returning safe HTML" %>
    
  3. ==============================

    3.나는 당신이 모든 변수 주위에 c : out을 사용할 필요가 없다는데 동의한다. 나는 왜 http://tech.finn.no/2011/04/08/xss-protection-whos-responsibility/에서 기술하는지 블로그를 썼다.

    나는 당신이 모든 변수 주위에 c : out을 사용할 필요가 없다는데 동의한다. 나는 왜 http://tech.finn.no/2011/04/08/xss-protection-whos-responsibility/에서 기술하는지 블로그를 썼다.

    그것은 여기에 언급 된 많은 것을 다루고 있습니다.

  4. from https://stackoverflow.com/questions/4465583/alternative-to-using-cout-to-prevent-xss by cc-by-sa and MIT license