Welke tekens echt geëscaped moeten worden
Vijf. Al het andere in een HTML-document is data; deze houden op data te zijn en worden syntaxis.
| Teken | Benoemd | Decimaal | Hex | Waar het geëscaped moet worden |
|---|---|---|---|---|
| & | & | & | & | Overal. Een niet-geëscapete ampersand start een character reference, dus "R&D" kan de tekst erachter opslokken. |
| < | < | < | < | Overal. Een niet-geëscapet kleiner-dan-teken start een tag, en zo wordt tekst opeens markup. |
| > | > | > | > | In tekst. Een groter-dan-teken is alleen naast een tag dubbelzinnig, maar escapen kost niets en voorkomt de randgevallen. |
| " | " | " | " | In attribuutwaarden met dubbele aanhalingstekens, waar een niet-geëscapet aanhalingsteken de waarde te vroeg afsluit. |
| ' | ' | ' | ' | In attribuutwaarden met enkele aanhalingstekens, en in tekst die in een JavaScript-string wordt geplakt. |
Een attribuut is geen tekstknoop
Dezelfde tekst heeft andere escaping nodig, afhankelijk van waar in het document hij landt.
- Tekstknoop: alleen
&en<kunnen het parsen breken.>wordt hier ook geëscaped, uit gewoonte. - Attribuut tussen aanhalingstekens: het aanhalingsteken dat de waarde opende moet er ook uit,
"of'. Alleen<escapen laat het attribuut afsluitbaar, en dat is genoeg om er een nieuw attribuut achter te zetten. - Attribuut zonder aanhalingstekens: spatie, tab, regeleinde,
=,`,<en>beëindigen allemaal de waarde. Zet je attributen tussen aanhalingstekens; zonder is het niet veilig te krijgen door vijf tekens te escapen. - Binnen
<script>of<style>: HTML escaping doet niets. Raw-text elementen decoderen geen character references, dus&blijft vijf letterlijke tekens. - In een URL: percent-encoding, geen character references. Zie de URL-encoder. Een URL binnen een attribuut heeft allebei nodig.
Escapen is niet saneren
Escapen zorgt dat een tekst zichzelf toont. Saneren parst HTML die je wilt houden en haalt eruit wat je niet vertrouwt, en dat is wat DOMPurify doet. Geëscapete uitvoer is in de verkeerde context nog steeds te misbruiken, en daarom is de OWASP XSS cheat sheet per context ingedeeld. Gebruik in een applicatie de escaping van je template engine; een handmatige ronde daar bovenop levert &amp;. Deze pagina is voor de gevallen daarbuiten: een databestand, een CMS-veld, een payload lezen.
Veelvoorkomende problemen
- Dubbel gecodeerd:
&amp;betekent dat de tekst twee keer geëscaped is, meestal één keer door je eigen code en één keer door de template engine. Unescape hier één keer om te zien welke laag eruit moet. - Puntkomma vergeten:
©decodeert,&hellipniet. Maar 106 van de 2.231 benoemde references zijn geldig zonder. Browsers pakken de langste naam en laten de rest als tekst staan, dus¬it;is het teken ¬ plus "it;". Hier geldt dezelfde regel. - Nummers 128 tot 159:
–geeft een en-streepje, geen stuurteken. De spec eist dat dat bereik als Windows-1252 gelezen wordt. 'zit in HTML5 en XML maar zat nooit in HTML 4.01. Gebruik'als de uitvoer een oude parser moet overleven.
Veelgestelde vragen
Wat is het verschil tussen een entity en een character reference?
& is een benoemde character reference; "entity" is de oudere term uit SGML en XML voor hetzelfde. De numerieke vormen waren altijd al character references.
Voorkomt escapen cross-site scripting?
Alleen in de context waar het bij past. De vijf tekens zijn genoeg voor een tekstknoop en een attribuutwaarde tussen aanhalingstekens, en doen niets voor een scriptblok, een attribuut zonder aanhalingstekens of een URL.
Moet ik elk niet-ASCII-teken escapen?
Meestal niet. Een bestand dat als UTF-8 wordt geserveerd houdt accenten, CJK en emoji gewoon vast. Escape ze als de uitvoer puur ASCII moet zijn: een oud e-mailsjabloon, een properties-bestand, een systeem dat alles boven codepunt 127 verminkt. Een emoji heeft geen naam, dus die komt er numeriek uit, één keer geëscaped als één codepunt in plaats van als twee UTF-16-helften.
Welke tekens moeten er echt geëscaped worden?
In tekstinhoud maar drie: de ampersand, het kleiner-dan-teken, en het groter-dan-teken voor de zekerheid. Binnen een attribuutwaarde tussen aanhalingstekens ook het gebruikte aanhalingsteken. De rest is optioneel, en daarom bestaat de minimale modus en is het hele alfabet escapen een gewoonte om af te leren.