Есть ли способ рекомендуется бежать <
, >
, "
и &
символы при выводе HTML в обычном коде Java? (Кроме ручного выполнения следующего, то есть).
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "<").replace("&", "&"); // ...
source.replace("&", "&").replace("<", "<");
Ответы:
StringEscapeUtils от Apache Commons Lang :
Для версии 3 :
источник
StringEscapeUtils
это и хорошо, он не будет корректно выходить из пробелов для атрибутов, если вы хотите избежать нормализации пробелов в HTML / XML. Смотрите мой ответ для более подробной информации.Альтернатива Apache Commons: Использование Spring «s
HtmlUtils.htmlEscape(String input)
метод.источник
StringEscapeUtils.escapeHtml()
отapache-commons
2.6) , поскольку она оставляет русские символы как есть.Хороший короткий метод:
Основано на https://stackoverflow.com/a/8838023/1199155 (там отсутствует усилитель). Согласно условию http://www.w3.org/TR/html4/sgml/entities.html, четыре символа, отмеченные в предложении if, являются единственными символами ниже 128.
источник
Существует более новая версия библиотеки Apache Commons Lang, в которой используется другое имя пакета (org.apache.commons.lang3). В
StringEscapeUtils
настоящее время есть разные статические методы для экранирования документов разных типов ( http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html ). Итак, чтобы избежать строки HTML версии 4.0:источник
Для тех, кто использует Google Guava:
источник
На Android (API 16 или выше) вы можете:
или для более низкого API:
источник
escapeHtml
вместоhtmlEncode
?Будьте осторожны с этим. В HTML-документе есть несколько различных «контекстов»: внутри элемента, значения атрибута в кавычках, значения атрибута без кавычек, атрибута URL, javascript, CSS и т. Д. Вам нужно будет использовать разные методы кодирования для каждого из они предотвращают межсайтовый скриптинг (XSS). Проверка на листе OWASP XSS Предупреждение Чит для получения подробной информации о каждом из этих контекстов. Вы можете найти экранирующие методы для каждого из этих контекстов в библиотеке OWASP ESAPI - https://github.com/ESAPI/esapi-java-legacy .
источник
Для некоторых целей HtmlUtils :
источник
Хотя ответ @dfa
org.apache.commons.lang.StringEscapeUtils.escapeHtml
хорош, и я использовал его в прошлом, его не следует использовать для экранирования атрибутов HTML (или XML), в противном случае пробел будет нормализован (то есть все соседние пробельные символы станут одним пробелом).Я знаю это, потому что в моей библиотеке (JATL) были обнаружены ошибки, касающиеся атрибутов, в которых пробелы не сохранялись. Таким образом, у меня есть класс drop (copy n 'paste) (часть которого я украл из JDOM), который различает экранирование атрибутов и содержимого элементов .
Хотя это, возможно, и не имело большого значения в прошлом (правильное экранирование атрибутов), оно становится все более интересным, учитывая использование
data-
атрибутов HTML5 .источник
org.apache.commons.lang3.StringEscapeUtils больше не поддерживается. Теперь вы должны использовать org.apache.commons.text.StringEscapeUtils
источник
Большинство библиотек предлагают экранирование всего, что могут, в том числе сотни символов и тысячи не-ASCII символов, а это не то, что вам нужно в мире UTF-8.
Кроме того, как отметил Джефф Уильямс, нет единой опции «escape HTML», есть несколько контекстов.
Предполагая, что вы никогда не используете атрибуты без кавычек, и учитывая, что существуют различные контексты, он написал мою собственную версию:
Рассмотрите возможность копирования из Gist без ограничения длины строки .
источник