utils escape ejemplo java html escaping

escape - jlabel java ejemplo



Método recomendado para escapar de HTML en Java (10)

¿Hay una forma recomendada de escapar de < , > , " y & caracteres al generar HTML en código Java simple? (Aparte de hacer manualmente lo siguiente).

String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML"; String escaped = source.replace("<", "&lt;").replace("&", "&amp;"); // ...


Buen método corto:

public static String escapeHTML(String s) { StringBuilder out = new StringBuilder(Math.max(16, s.length())); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c > 127 || c == ''"'' || c == ''<'' || c == ''>'' || c == ''&'') { out.append("&#"); out.append((int) c); out.append('';''); } else { out.append(c); } } return out.toString(); }

Basado en https://.com/a/8838023/1199155 (falta el amplificador allí). Los cuatro caracteres marcados en la cláusula if son los únicos por debajo de 128, de acuerdo con http://www.w3.org/TR/html4/sgml/entities.html


En Android (API 16 o superior) puedes:

Html.escapeHtml(textToScape);

o para una API más baja:

TextUtils.htmlEncode(textToScape);


Hay una versión más reciente de la biblioteca de Apache Commons Lang y utiliza un nombre de paquete diferente (org.apache.commons.lang3). 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 ). Así que para escapar de la cadena HTML versión 4.0:

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; String output = escapeHtml4("The less than sign (<) and ampersand (&) must be escaped before using them in HTML");


Para algunos propósitos, HtmlUtils :

import org.springframework.web.util.HtmlUtils; [...] HtmlUtils.htmlEscapeDecimal("&")` //gives &#38; HtmlUtils.htmlEscape("&")` //gives &amp;


Para aquellos que usan Google Guava:

import com.google.common.html.HtmlEscapers; [...] String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML"; String escaped = HtmlEscapers.htmlEscaper().escape(source);


Si bien la respuesta de @dfa de org.apache.commons.lang.StringEscapeUtils.escapeHtml es buena y la he usado en el pasado, no debería usarse para escapar de los atributos HTML (o XML), de lo contrario el espacio en blanco se normalizará (es decir, todos los espacios en blanco adyacentes los personajes se convierten en un solo espacio).

Lo sé 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 caída en la clase (copiar y pegar) (de la que robé algo de JDOM) que diferencia el escape de los atributos y el contenido del elemento .

Si bien es posible que esto no haya tenido tanta importancia en el pasado (escape de atributo adecuado), es cada vez más de interés dado el uso del uso de atributos de data- de HTML5.


Ten cuidado con esto Hay varios "contextos" diferentes dentro de un documento HTML: dentro de un elemento, valor de atributo citado, valor de atributo no citado, atributo de URL, javascript, CSS, etc. ... Deberá usar un método de codificación diferente para cada uno estos para evitar las secuencias de comandos entre sitios (XSS). Consulte la Hoja de referencia de prevención XSS de OWASP para obtener detalles sobre cada uno de estos contextos: https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet ) https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet . Puede encontrar métodos de escape para cada uno de estos contextos en la biblioteca OWASP ESAPI: https://github.com/ESAPI/esapi-java-legacy .


Una alternativa a Apache Commons: use el método HtmlUtils.htmlEscape(String input) Spring .


org.apache.commons.lang3.StringEscapeUtils ahora está en desuso. Ahora debe usar org.apache.commons.text.StringEscapeUtils por

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>${commons.text.version}</version> </dependency>


StringEscapeUtils de Apache Commons Lang :

import static org.apache.commons.lang.StringEscapeUtils.escapeHtml; // ... String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML"; String escaped = escapeHtml(source);

Para la versión 3 :

import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4; // ... String escaped = escapeHtml4(source);