Metodo consigliato per la fuga in HTML, Java

C’è un metodo consigliato per la fuga <, >, " e & caratteri quando l’output HTML in formato di codice Java? (Altro che manualmente, eseguire le operazioni seguenti, che è).

String source = "The less than sign (<) and ampersand (&) must be escaped before using them in HTML";
String escaped = source.replace("<", "&lt;").replace("&", "&amp;"); //...
  • Essere consapevoli del fatto che se l’output non quotate in un attributo HTML, che altri personaggi come spazio, tab, backspace, ecc… può consentire agli aggressori di introdurre javascript attributi senza i caratteri elencati. Vedere la OWASP XSS Prevenzione Cheat Sheet per ulteriori.
InformationsquelleAutor Ben Lings | 2009-08-12



10 Replies
  1. 255

    StringEscapeUtils da 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);

    Per versione 3:

    import static org.apache.commons.lang3.StringEscapeUtils.escapeHtml4;
    //...
    String escaped = escapeHtml4(source);
    • Mentre StringEscapeUtils è bello non può sfuggire spazio corretto per gli attributi, se volete evitare di HTML/XML spazi di normalizzazione. Vedi la mia risposta per un maggiore dettaglio.
    • StringEscapeUtils.escapeHtml() accetta solo Stringa come input, che sembra inutilmente rigida. In questo mondo moderno di JSON, alcune cose di uscita per la pagina verrà numeri, per esempio, in che caso questo metodo si rompe.
    • L’esempio di cui sopra è rotto. Utilizzare escapeHtml4() metodo.
    • Per Guava fan vedere okranz la risposta qui sotto.
    • Se la pagina web è la codifica UTF-8, quindi tutti abbiamo bisogno è il Guava è htmlEscaper che sfugge solo i seguenti cinque caratteri ASCII: ‘”&<>. L’Apache escapeHtml() sostituisce i caratteri non-ASCII compresi gli accenti che sembra inutile con la codifica UTF-8 pagine web ?
    • Quando i numeri contengono il contenuto che deve essere sfuggito?
    • Quando uso escapeHtml(ingresso), il doppio quot (“nella mia stringa HTML ottiene convertito in &quot; che non voglio. C’è un modo per modificarla?
    • Ora è sconsigliata a commons-lang3. E ‘ stato spostato a commons.apache.org/proper/commons-text
    • href=”https://stackoverflow.com/users/597419/danny”>stackoverflow.com/users/597419/danny – che il link non parlare di fuga HTML. Puoi essere più specifico?
    • Ecco i link diretti per l’ultima spazio dei nomi org.apache.commons.di testo.StringEscapeUtils @Danny menzionato
    • NOTA: StringEscapeUtils.escapeHtml dos non può sfuggire il carattere di apostrofo, lasciando con un grosso bug o anche di una vulnerabilità di sicurezza. Utilizzare altri strumenti di lavoro, come la Primavera HtmUtils o altri menzionati.

  2. 126

    Un’alternativa ad Apache Commons: Utilizzare Primavera‘s HtmlUtils.htmlEscape(String input) metodo.

    • Grazie. Io l’ho usato (invece di StringEscapeUtils.escapeHtml() da apache-commons 2.6) perché lascia i caratteri russi come è.
    • Che è bene sapere. TBH mi danno Apache roba largo in questi giorni.
    • L’ho usato, troppo, lascia i caratteri Cinesi come è, troppo.
    • Come ci si confronta con guava alternative di seguito menzionati?
    • E codifica inoltre l’apostrofo, quindi è effettivamente utile, a differenza di apache StringEscapeUtils
  3. 53

    Breve metodo:

    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();
    }

    Base https://stackoverflow.com/a/8838023/1199155 (l’ampli non è presente). I quattro personaggi controllati in se le clausole sono quelle di seguito 128, secondo http://www.w3.org/TR/html4/sgml/entities.html

    • Bello. Non utilizzare la “versione html” delle codifiche (esempio: “á” sarebbe “&aacute;” al posto di “&#225;”), ma dato numerico quelli di lavoro anche in IE7 credo di non preoccuparsi. Grazie.
    • Perché codificare tutti i caratteri quando l’OP ha chiesto per sfuggire al 4 relativi caratteri? Sono un inutile spreco di CPU e di memoria.
    • Hai dimenticato l’apostrofo. Così la gente può iniettare non quotate attributi ovunque dove questo codice è utilizzato per sfuggire ai valori di attributo.
  4. 45

    C’è una versione più recente del Apache Commons Lang biblioteca e utilizza un diverso nome del pacchetto (org.apache.commons.lang3). Il StringEscapeUtils ora ha diversi metodi statici per la fuoriuscita dei diversi tipi di documenti (http://commons.apache.org/proper/commons-lang/javadocs/api-3.0/index.html). Così, per sfuggire versione HTML 4.0 stringa:

    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");
    • Purtroppo non esiste nulla di HTML 5, né il Apache documenti di specificare se è corretto usare il escapeHtml4 per HTML 5.
  5. 39

    Per coloro che usano 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);
  6. 38

    Su android API (16 o più), è possibile:

    Html.escapeHtml(textToScape);

    o inferiore API:

    TextUtils.htmlEncode(textToScape);
    • C’è qualche motivo per utilizzare escapeHtml invece di htmlEncode?
    • Vedi anche la mia la mia domanda circa la differenza tra questi due. (@Muz )
  7. 37

    Essere attenti a questo. Ci sono un certo numero di diversi contesti’ all’interno di un documento HTML: all’Interno di un elemento, citato valore di attributo, non quotate attributo valore attributo URL, javascript, CSS, ecc… È necessario utilizzare un diverso metodo di codifica per ciascuno di questi per evitare la Cross-Site Scripting (XSS). Controllare la OWASP XSS Prevenzione Cheat Sheet per ciascuno di questi contesti — https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet. Si può trovare in fuga metodi per ciascuno di questi contesti OWASP ESAPI library — https://github.com/ESAPI/esapi-java-legacy.

    • GRAZIE per la precisazione che contesto in cui si desidera codificare l’output molto importante. Il termine “codificare” è anche un modo molto più appropriato verbo di “fuga”, come bene. La fuga comporta qualche tipo di hack, rispetto a “come faccio a codifica questa stringa: XHTML attributo / SQL query di parametro / PostScript stringa di stampa / output CSV campo?
    • ‘Codificare’ e la ‘fuga’ sono entrambi ampiamente utilizzati per descrivere questo. Il termine “fuga” è generalmente usato quando il processo è quello di aggiungere un “carattere di escape” prima sintatticamente rilevanti di carattere, come la fuga una citazione di un personaggio con una barra rovesciata (\”Il termine “codificare” è più usato quando si traduce un carattere in una forma diversa, come ad esempio la codifica URL, il carattere preventivo %22 o entità HTML codifica &#x22 o @quot.
    • owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/index.html. link ora si è rotto
    • Per risparmiare un po ‘ di ricerche su google, cercare il Codificatore classe statico.javadoc.io/org.owasp.esapi/esapi/2.0.1/org/owasp/esapi/…
  8. 14

    Per alcuni scopi, HtmlUtils:

    import org.springframework.web.util.HtmlUtils;
    [...]
    HtmlUtils.htmlEscapeDecimal("&"); //gives &#38;
    HtmlUtils.htmlEscape("&"); //gives &amp;
    • Dalla primavera HtmlUtils commenti: * <p>Per un set completo di Stringa di escape utilità, * considerare Apache Commons Lang e la sua StringEscapeUtils classe. * Noi non si utilizza la classe qui per evitare una dipendenza di runtime * su Commons Lang solo per HTML fuga. Inoltre, Primavera * HTML fuggire è più flessibile e 100% HTML 4.0 compatibile. Se si sta già utilizzando Apache commons nel progetto, probabilmente si dovrebbe usare il StringEscapeUtils da apache
  9. 10

    Mentre @dfa risposta di org.apache.commons.lang.StringEscapeUtils.escapeHtml è bello, e l’ho usato in passato non deve essere utilizzato per la fuga HTML (o XML) attributi altrimenti lo spazio sarà normalizzato (cioè tutte adiacenti spazi diventano un unico spazio).

    Questo lo so perché ho avuto dei bug contro la mia libreria (JATL) per gli attributi dove gli spazi non è stato mantenuto. Così ho un drop in (copia n’ paste) classe (di cui ho rubato un po ‘ da JDOM) che differenzia la fuga di attributi e contenuto dell’elemento.

    Mentre questo non può essere importava tanto in passato (attributo corretto in fuga) è diventata sempre più di maggiore interesse, dato l’utilizzo di HTML5 è data- utilizzo dell’attributo.

  10. 5

    org.apache.commons.lang3.StringEscapeUtils è diventato obsoleto. È ora necessario utilizzare org.apache.commons.di testo.StringEscapeUtils da

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

Lascia un commento