¿Hay un método recomendado para escapar <
, >
, "
y &
caracteres cuando se da salida HTML en código Java normal? (Aparte de hacer manualmente lo siguiente, es decir).
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "<").replace("&", "&"); // ...
source.replace("&", "&").replace("<", "<");
Respuestas:
StringEscapeUtils de Apache Commons Lang :
Para la versión 3 :
fuente
StringEscapeUtils
es bueno, no escapará de los espacios en blanco correctamente para los atributos si desea evitar la normalización de espacios en blanco HTML / XML. Vea mi respuesta para más detalles.Una alternativa a Apache Commons: uso el
HtmlUtils.htmlEscape(String input)
método de Spring .fuente
StringEscapeUtils.escapeHtml()
a partir deapache-commons
2.6), ya que deja caracteres rusos como está.Buen método corto:
Basado en https://stackoverflow.com/a/8838023/1199155 (falta el amplificador allí). Los cuatro caracteres marcados en la cláusula if son los únicos inferiores a 128, de acuerdo con http://www.w3.org/TR/html4/sgml/entities.html
fuente
Hay una versión más reciente de la biblioteca Lang de Apache Commons y utiliza un nombre de paquete diferente (org.apache.commons.lang3). El
StringEscapeUtils
ahora tiene diferentes métodos estáticos para escapar de diferentes tipos de documentos ( http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html ). Entonces, para escapar de la cadena HTML versión 4.0:fuente
Para aquellos que usan Google Guava:
fuente
En Android (API 16 o superior) puedes:
o para API inferior:
fuente
escapeHtml
lugar dehtmlEncode
?Ten cuidado con esto. Hay un número de 'contextos' diferentes dentro de un documento HTML: dentro de un elemento, valor de atributo entre comillas, valor de atributo sin comillas, atributo URL, javascript, CSS, etc. Deberá usar un método de codificación diferente para cada uno de ellos. estos para evitar secuencias de comandos entre sitios (XSS). Consulte la hoja de trucos de prevención OWASP XSS para obtener detalles sobre cada uno de estos contextos. Puede encontrar métodos de escape para cada uno de estos contextos en la biblioteca OWASP ESAPI: https://github.com/ESAPI/esapi-java-legacy .
fuente
Para algunos propósitos, HtmlUtils :
fuente
Si bien la respuesta @dfa de
org.apache.commons.lang.StringEscapeUtils.escapeHtml
es agradable y la he usado en el pasado, no debería usarse para escapar de los atributos HTML (o XML) contrario, el espacio en blanco se normalizará (lo que significa que todos los caracteres de espacio en blanco adyacentes se convierten en un solo espacio).Sé esto porque he tenido errores archivados en mi biblioteca (JATL) para los atributos donde no se conservó el espacio en blanco. Por lo tanto, tengo una clase de caída (copiar y pegar) (de la que robé algunos de JDOM) que diferencia el escape de atributos y contenido de elementos .
Si bien esto puede no haber importado tanto en el pasado (escape de atributo adecuado), cada vez tiene más interés dado el uso del uso de
data-
atributos de HTML5 .fuente
org.apache.commons.lang3.StringEscapeUtils ahora está en desuso. Ahora debe usar org.apache.commons.text.StringEscapeUtils por
fuente
La mayoría de las bibliotecas ofrecen escapar de todo lo que pueden, incluidos cientos de símbolos y miles de caracteres que no son ASCII, que no es lo que quieres en el mundo UTF-8.
Además, como señaló Jeff Williams, no existe una única opción de "escape HTML", hay varios contextos.
Suponiendo que nunca use atributos sin comillas, y teniendo en cuenta que existen diferentes contextos, he escrito mi propia versión:
Considere copiar y pegar desde Gist sin límite de longitud de línea .
fuente