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("<", "&lt;").replace("&", "&amp;"); // ...
223
demandé sur Josh Lee 2009-08-12 13:57:53

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);
238
répondu dfa 2015-08-04 14:35:49

une alternative à Apache Commons: utiliser la méthode Spring 's HtmlUtils.htmlEscape(String input) .

114
répondu Adamski 2009-08-12 10:23:40

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

50
répondu Bruno Eberhard 2017-05-23 12:34:48

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");
45
répondu Martin Dimitrov 2013-09-23 05:14:05

sur android (API 16 ou plus) vous pouvez:

Html.escapeHtml(textToScape);

ou pour L'API inférieure:

TextUtils.htmlEncode(textToScape);
35
répondu OriolJ 2013-04-05 09:41:23

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 .

35
répondu Jeff Williams 2017-01-06 04:28:48

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);
32
répondu okrasz 2014-10-26 11:40:31

, HtmlUtils :

import org.springframework.web.util.HtmlUtils;
[...]
HtmlUtils.htmlEscapeDecimal("&")` //gives &#38;
HtmlUtils.htmlEscape("&")` //gives &amp;
13
répondu AUU 2012-08-08 21:08:54

, 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.

10
répondu Adam Gent 2013-08-07 20:26:10

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>
1
répondu Luca Stancapiano 2018-05-30 09:54:23