Czy jest zalecanym sposobem ucieczki <
, >
, "
a &
znaki przy wysyłaniu HTML w zwykły kod Java? (Innymi słowy niż ręczne wykonanie następujących czynności).
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "<").replace("&", "&"); // ...
source.replace("&", "&").replace("<", "<");
Odpowiedzi:
StringEscapeUtils z Apache Commons Lang :
Dla wersji 3 :
źródło
StringEscapeUtils
jest to miłe, nie będzie poprawnie uciekał do białych znaków dla atrybutów, jeśli chcesz uniknąć normalizacji białych znaków HTML / XML. Zobacz moją odpowiedź, aby uzyskać więcej szczegółów.Alternatywą dla Apache Commons: Redakcyjne wiosennego „s
HtmlUtils.htmlEscape(String input)
metody.źródło
StringEscapeUtils.escapeHtml()
z wersjiapache-commons
2.6), ponieważ pozostawia rosyjskie znaki bez zmian .Ładna krótka metoda:
Na podstawie https://stackoverflow.com/a/8838023/1199155 (wzmacniacza tam nie ma). Cztery znaki zaznaczone w klauzuli if są jedynymi poniżej 128, zgodnie z http://www.w3.org/TR/html4/sgml/entities.html
źródło
Istnieje nowsza wersja biblioteki Apache Commons Lang i używa innej nazwy pakietu (org.apache.commons.lang3).
StringEscapeUtils
Ma teraz różne metody statyczne do ucieczki różnych typów dokumentów ( http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html ). Aby uniknąć łańcucha znaków HTML w wersji 4.0:źródło
Dla tych, którzy korzystają z Google Guava:
źródło
Na Androidzie (API 16 lub nowszy) możesz:
lub dla niższego API:
źródło
escapeHtml
zamiasthtmlEncode
?Uważaj na to. W dokumencie HTML istnieje wiele różnych „kontekstów”: wewnątrz elementu, cytowanej wartości atrybutu, niecytowanej wartości atrybutu, atrybutu URL, javascript, CSS itp. Dla każdej z tych opcji należy użyć innej metody kodowania te, aby zapobiec skryptom krzyżowym (XSS). Sprawdź arkusza OWASP XSS Zapobieganie Cheat szczegóły na każdym z tych kontekstów. Metody ucieczki dla każdego z tych kontekstów można znaleźć w bibliotece OWASP ESAPI - https://github.com/ESAPI/esapi-java-legacy .
źródło
Do niektórych celów HtmlUtils :
źródło
Chociaż odpowiedź @dfa
org.apache.commons.lang.StringEscapeUtils.escapeHtml
jest dobra i korzystałem z niej w przeszłości, nie należy jej używać do zmiany znaczenia atrybutów HTML (lub XML), w przeciwnym razie białe znaki zostaną znormalizowane (co oznacza, że wszystkie sąsiadujące białe znaki stają się pojedynczą spacją).Wiem o tym, ponieważ zgłoszono błędy w mojej bibliotece (JATL) dotyczące atrybutów, w których nie zostały zachowane białe znaki. Mam więc klasę drop (wklej i wklej) (której część ukradłem z JDOM), która odróżnia ucieczkę atrybutów i zawartości elementu .
Chociaż w przeszłości mogło to nie mieć większego znaczenia (prawidłowe ucieczkowanie atrybutów), staje się coraz bardziej interesujące, biorąc pod uwagę użycie
data-
atrybutu HTML5 .źródło
org.apache.commons.lang3.StringEscapeUtils jest teraz przestarzały. Musisz teraz użyć org.apache.commons.text.StringEscapeUtils przez
źródło
Większość bibliotek oferuje unikanie wszystkiego, co się da, w tym setek symboli i tysięcy znaków spoza ASCII, co nie jest tym, czego chcesz w świecie UTF-8.
Ponadto, jak zauważył Jeff Williams, nie ma jednej opcji „escape HTML”, istnieje kilka kontekstów.
Zakładając, że nigdy nie używasz nieocenionych atrybutów i pamiętając, że istnieją różne konteksty, napisałem własną wersję:
Rozważ wklejenie kopii z Gist bez limitu długości linii .
źródło