2010-08-05 10 views
19

Szukam klasy/utylizacji itp. W celu odkażenia kodu HTML, tj. Usunięcia niebezpiecznych znaczników, atrybutów i wartości, aby uniknąć XSS i podobnych ataków.Jak odkażać kod HTML w Javie, aby zapobiec atakom XSS?

Otrzymuję kod html z edytora tekstu formatowanego (np. TinyMCE), ale można go wysłać złośliwie, zastępując sprawdzanie TinyMCE ("Dane przesłane poza formularzem").

Czy jest coś tak prostego w użyciu jak InputFilter w PHP? Idealne rozwiązanie mogę sobie wyobrazić, jak to działa (zakładamy Sanitizer jest zamknięty w klasie 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... 

Aktualizacja - prostsze rozwiązanie, tym lepiej! Niewielka klasa użytkowa z tak niewielkimi zewnętrznymi zależnościami od innych bibliotek/frameworków, jak to możliwe - byłaby dla mnie najlepsza.


Co z tym?

+0

Zasadniczo chcesz, aby klienci mogli przesyłać formularze, które są następnie wyświetlane w formacie fx. księga gości? Czy chcesz, aby były w stanie używać html, ale nadal chcesz blokować szkodliwe próby hakowania przez użytkowników? Czy też się tu nie myliłem ...? – Latze

+0

@ Latze: Chcę, aby klienci (użytkownicy za pośrednictwem ich przeglądarek) przesyłali treści richtext (format html za pomocą edytora tekstu formatowanego - TinyMCE), ale aby sprawdzić i usunąć potencjalnie niebezpieczne (niebezpieczne) treści. Nie wiem, co to jest fx i księga gości, o której wspominasz w tym kontekście. – WildWezyr

+0

Ah! Dam mu szansę, daj mi kilka minut – Latze

Odpowiedz

12

Można użyć OWASP ESAPI for Java, która jest biblioteką zabezpieczeń zbudowaną do wykonywania takich operacji.

Ma nie tylko kodery do HTML, ale także enkodery do kodowania JavaScript, CSS i URL. Sample uses of ESAPI można znaleźć w skorowidze zapobiegania XSS opublikowanej przez OWASP.

Możesz użyć projektu OWASP AntiSamy do zdefiniowania polityki witryny określającej, co jest dozwolone w treści przesłanej przez użytkownika. Zasady serwisu można później wykorzystać do uzyskania "czystego" HTML, który jest wyświetlany z powrotem. Na AntiSamy downloads page można znaleźć próbkę TinyMCE policy file.

+0

wymagałoby to przebudowania architektury całego mojego projektu. nie chcę tego zrobić. Potrzebuję czegoś prostego bez wielu zależności i nie trzeba zmieniać sposobu, w jaki mój kod jest zorganizowany (podoba mi się to tak, jak jest teraz). więc - do wykonania pracy potrzebuję tylko klasy użytkowej. moje pytanie zostało teraz zaktualizowane, aby wyjaśnić ten wymóg. – WildWezyr

+2

Nie jestem pewien, co masz na myśli, przebudowując architekturę projektu. AntiSamy idealnie pasuje do Twojego wymagania, pozwalając, aby dane wejściowe edytora tekstów były przesyłane do biblioteki filtrowania opartej na zasadach witryny. –

+0

Hmmm. Wygląda na to, że masz rację! Po prostu myślałem, że to duże i ciężkie środowisko, takie jak rozpórki, wiosna itp. I działa jak filtr filtrów ;-). Prawdopodobnie wprowadzono tu duże litery ("OWASP"). BTW: jakie są dokładne zależności OWASP AntiSamy - czego jeszcze będę musiał użyć? – WildWezyr

6

HTML ucieczce wejść działa bardzo dobrze. Ale w niektórych przypadkach reguły biznesowe mogą wymagać, abyś NIE uciekł z HTML. Używanie REGEX nie nadaje się do tego zadania i trudno jest znaleźć dobre rozwiązanie z jego wykorzystaniem.

Najlepszym rozwiązaniem znalazłem używać: http://jsoup.org/cookbook/cleaning-html/whitelist-sanitizer

To buduje drzewa DOM z dostarczonego wejściowych i filtruje żadnego elementu nie previosly dozwolonych przez białej listy. Interfejs API ma również inne funkcje do czyszczenia html.

I to może być również używany z javax.validation @SafeHtml (whitelistType =, =) additionalTags

9

Można spróbować OWASP Java HTML Sanitizer. Jest bardzo prosty w użyciu.

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

String safeHTML = policy.sanitize(untrustedHTML); 
3

Dzięki @ Saljack's answer. Wystarczy opracować więcej do OWASP Java HTML Sanitizer. Udało mi się to bardzo dobrze (szybko). Właśnie dodałem do pom.xml w moim projekcie Maven:

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

Sprawdź najnowszą wersję na temat here.

Następnie dodano tę funkcję dezynfekcji:

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); 
    } 

więcej znaczników można dodawać poprzez rozszerzenie przecinek ograniczony parametr w sposobie allowElements.

Wystarczy dodać tę linię przed minięciu fasoli off, aby zapisać dane:

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

To jest to!

Dla bardziej złożonej logiki, biblioteka ta jest bardzo elastyczna i może obsługiwać bardziej zaawansowaną implementację sanityzacji.

Powiązane problemy