Méthode recommandée pour échapper au HTML en Java
y a-t-il un moyen recommandé de s'échapper <
, >
, "
et &
caractères lors de la sortie HTML dans le code Java simple? (Autre que faire manuellement ce qui suit, c'est-à-dire).
String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "<").replace("&", "&"); // ...
10 réponses
StringEscapeUtils from 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);
pour version 3 :
import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
// ...
String escaped = escapeHtml4(source);
Belle petite méthode:
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();
}
basé sur https://stackoverflow.com/a/8838023/1199155 (l'ampli est manquant). Les quatre caractères cochés dans la clause if sont les seuls au-dessous de 128, selon http://www.w3.org/TR/html4/sgml/entities.html
il existe une nouvelle version de la Apache Commons Lang library et elle utilise un nom de paquet différent (org.Apache.commun.lang3). Le StringEscapeUtils
a maintenant différentes méthodes statiques pour échapper à différents types de documents ( http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html ). Ainsi, pour échapper à la version HTML 4.0 string:
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");
sur android (API 16 ou plus) vous pouvez:
Html.escapeHtml(textToScape);
ou pour L'API inférieure:
TextUtils.htmlEncode(textToScape);
faites attention avec ça. Il existe un certain nombre de "contextes" différents dans un document HTML: à l'intérieur d'un élément, valeur d'attribut Citée, valeur d'attribut non Citée, attribut URL, javascript, CSS, etc... Vous aurez besoin d'utiliser une méthode d'encodage différente pour chacun de ceux-ci pour empêcher le script Cross-Site (XSS). Pour plus de détails sur chacun de ces contextes, consultez la feuille de renseignements sur la prévention de L'OWASP XSS -- https://www.owasp.org/index.php/XSS_ (Cross_Site_Scripting)_Prevention_Cheat_Sheet . Vous pouvez trouver des méthodes d'échappement pour chacun de ces contextes dans la bibliothèque OWASP ESAPI -- https://github.com/ESAPI/esapi-java-legacy .
pour ceux qui utilisent 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);
, Tandis que @dfa réponse de org.apache.commons.lang.StringEscapeUtils.escapeHtml
est belle et je l'ai utilisé dans le passé, il ne devrait pas être utilisé pour échapper HTML (ou XML) attributs , sinon, le les espaces seront normalisés (ce qui signifie que tous les espaces adjacents à devenir une seule de l'espace).
je le sais parce que j'ai fait classer des bogues dans ma bibliothèque (JATL) pour des attributs où l'espace blanc n'était pas préservé. Ainsi j'ai une chute dans (copier n'coller) classe (dont I stole some from JDOM) qui différencie l'évasion des attributs et du contenu de l'élément .
bien que cela n'ait peut-être pas eu autant d'importance dans le passé (fuite de l'attribut approprié), il est de plus en plus d'intérêt étant donné l'utilisation de l'utilisation de l'attribut data-
de HTML5.
org.Apache.commun.lang3.StringEscapeUtils est maintenant déprécié. Vous devez maintenant utiliser org.Apache.commun.texte.StringEscapeUtils by
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
<version>${commons.text.version}</version>
</dependency>