2010-08-05 2 views
19

클래스/유틸리티 등을 찾고 HTML 코드를 삭제합니다. 즉 XSS 및 유사한 공격을 피하기 위해 위험한 태그, 속성 및 값을 제거합니다.XSS 공격을 방지하기 위해 Java에서 HTML 코드를 어떻게 위생 처리합니까?

서식있는 텍스트 편집기 (예 : TinyMCE)에서 html 코드를 얻을 수 있지만 악의적 인 방법으로 TinyMCE 유효성 검사 ("데이터는 오프 사이트 양식 제출")를 보낼 수 있습니다.

PHP의 InputFilter처럼 사용하기 쉬운 것이 있습니까? 완벽한 솔루션은 그와 같은 작품 (소독제를 가정 HtmlSanitizer 클래스에서 캡슐화)를 상상할 수 :

String unsanitized = "...<...>...";   // some potentially 
               // dangerous html here on input 

HtmlSanitizer sat = new HtmlSanitizer();  // sanitizer util class created 

String sanitized = sat.sanitize(unsanitized); // voila - sanitized is safe... 

업데이트 - 간단한 솔루션을, 더 나은! 가능한 한 다른 라이브러리/프레임 워크에 대한 외부 의존성이없는 작은 util 클래스가 가장 적합 할 것입니다.


어때요?

+0

그래서 기본적으로 클라이언트가 형식을 제출하여 fx 형태로 표시 할 수 있어야합니다. 방명록? 그리고 사용자가 html을 사용할 수 있기를 원하지만 악의적 인 사용자가 해킹 시도를 차단할 수 있기를 원하십니까? 아니면 내가 여기서 잘못 했어? – Latze

+0

@Latze : 클라이언트 (브라우저를 통해 사용자)가 richtext 콘텐츠 (서식있는 텍스트 편집기 -TinyMCE를 통해 HTML 형식)를 제출하지만 잠재적으로 위험한 (안전하지 않은) 내용을 확인하고 제거하도록합니다. 이 컨텍스트에서 언급 한 fx와 방명록은 무엇인지 모르겠습니다. – WildWezyr

+0

아! 내가 총을 줘, 2 분 정도 줘 – Latze

답변

12

OWASP ESAPI for Java은 이러한 작업을 수행하기 위해 빌드 된 보안 라이브러리입니다.

HTML 용 인코더뿐만 아니라 JavaScript, CSS 및 URL 인코딩을 수행하는 인코더도 있습니다. Sample uses of ESAPI은 OWASP에서 발행 한 XSS 예방 치트 시트에서 찾을 수 있습니다.

OWASP AntiSamy 프로젝트를 사용하여 사용자 제출 콘텐츠에 허용되는 사이트 정책을 정의 할 수 있습니다. 사이트 정책은 나중에 표시되는 "깨끗한"HTML을 얻는 데 사용될 수 있습니다. AntiSamy downloads page에서 샘플TinyMCE policy file을 찾을 수 있습니다. Antisamy에 대해서는

+0

이것은 내 전체 프로젝트의 아키텍처를 재구성해야 할 필요가있다. 나는 그것을 기꺼이하지 않는다. 나는 많은 의존성없이 간단하고 내 코드가 체계화되어있는 방식을 바꿀 필요가 없다. (나는 지금과 같은 방식이다.) 그래서 - 나는 일을하기 위해 단지 util 클래스가 필요하다. 내 질문은 지금 그 요구 사항을 명확하게 업데이 트됩니다. – WildWezyr

+2

프로젝트의 아키텍처를 재구성하면 무슨 뜻인지 알 수 없습니다. AntiSamy는 사이트 정책에 따라 필터링 라이브러리에 텍스트 편집기 입력을 제공함으로써 요구 사항에 완벽하게 부합합니다. –

+0

흠. 당신 말이 맞아요! 방금 struts, spring 등과 같이 크고 무거운 프레임 워크라고 생각했고 일종의 서블릿 필터로 작동합니다 .--). 아마도 이름에 큰 글자 ("OWASP")가 나와 여기 오해했을 것입니다. BTW : OWASP AntiSamy의 정확한 종속성은 무엇입니까? 사용하려면 무엇이 필요합니까? – WildWezyr

6

HTML 아주 잘 작동합니다. 그러나 비즈니스 규칙에 따라 HTML을 벗어나지 않아야하는 경우도 있습니다. REGEX를 사용하는 것은 작업에 적합하지 않으며 사용하기에 좋은 솔루션을 찾기 란 너무 어렵습니다. http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

그것은 지정된 입력과 DOM 트리를 빌드와 previosly 허용 목록에 의해 허용되지 않는 모든 요소를 ​​필터링 :

내가 찾은 가장 좋은 방법은 사용하는 것이 었습니다. API에는 html 정리를위한 다른 기능도 있습니다.

그리고 또한

9

당신은 OWASP Java HTML Sanitizer을 시도 할 수 javax.validation의 @SafeHtml (whitelistType = additionalTags =)와 함께 사용할 수 있습니다. 사용하기가 매우 쉽습니다.

PolicyFactory policy = new HtmlPolicyBuilder() 
    .allowElements("a") 
    .allowUrlProtocols("https") 
    .allowAttributes("href").onElements("a") 
    .requireRelNofollowOnLinks() 
    .build(); 

String safeHTML = policy.sanitize(untrustedHTML); 
3

덕분에 @ Saljack의 answer 덕분입니다. 그냥 OWASP Java HTML Sanitizer 더 자세히 설명합니다. 그것은 나를 위해 정말로 잘 (빨리) 일했습니다. 방금 다음을 pom에 추가했습니다.내 Maven 프로젝트의 xml :

<dependency> 
     <groupId>com.googlecode.owasp-java-html-sanitizer</groupId> 
     <artifactId>owasp-java-html-sanitizer</artifactId> 
     <version>20150501.1</version> 
    </dependency> 

최신 릴리스는 here을 확인하십시오.

그러면 I은 위생 처리를 위해 이러한 기능을 추가 :

private String sanitizeHTML(String untrustedHTML){ 
     PolicyFactory policy = new HtmlPolicyBuilder() 
      .allowAttributes("src").onElements("img") 
      .allowAttributes("href").onElements("a") 
      .allowStandardUrlProtocols() 
      .allowElements(
      "a", "img" 
      ).toFactory(); 

     return policy.sanitize(untrustedHTML); 
    } 

이상의 태그는 allowElements 방법에서 쉼표로 구분 파라미터를 확장하여 추가 될 수있다.

그냥 데이터를 저장하기 위해 오프 빈을 통과하기 전에이 줄을 추가합니다 : 그것은

bean.setHtml(sanitizeHTML(bean.getHtml())); 

의 그!

더 복잡한 논리의 경우이 라이브러리는 매우 유연하며 더 정교한 위생 구현을 처리 할 수 ​​있습니다.