Welke tekens moeten worden geëscaped in HTML?

Zijn ze hetzelfde als XML, misschien plus de spatie ( )?

Ik heb een aantal enorme lijsten met HTML-escape-tekens gevonden, maar ik denk niet dat ze moetenworden geëscaped. Ik wil weten wat er moetom te ontsnappen.


Antwoord 1, autoriteit 100%

Als u tekstinhoud in uw document invoegt op een locatie waar tekstinhoud wordt verwacht1, u hoeft normaal gesproken alleen dezelfde tekens te escapen als in XML. Binnen een element omvat dit alleen de entiteit escape ampersand &en het elementscheidingsteken kleiner-dan en groter-dan-tekens < >:

& becomes &amp;
< becomes &lt;
> becomes &gt;

Binnen attribuutwaarden moet u ook escapetekens gebruiken voor het aanhalingsteken dat u gebruikt:

" becomes &quot;
' becomes &#39;

In sommige gevallen kan het veilig zijn om het escapen van sommige van deze tekens over te slaan, maar ik raad je aan om in alle gevallen te ontsnappen aan alle vijf om de kans op het maken van een fout te verkleinen.

Als je documentcodering niet alle tekens ondersteunt die je gebruikt, bijvoorbeeld als je emoji probeert te gebruiken in een ASCII-gecodeerd document, moet je daar ook aan ontsnappen. De meeste documenten worden tegenwoordig gecodeerd met de volledig Unicode-ondersteunende UTF-8-codering waar dit niet nodig is.

In het algemeen moet u niet ontsnappen aan spaties als &nbsp;. &nbsp;is geen normale ruimte, het is een niet-breekruimte . U kunt deze gebruiken in plaats van normale ruimtes om te voorkomen dat een lijnvakantie tussen twee woorden wordt ingebracht of om te invoegen en nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; extra & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ruimte & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; zonder dat het automatisch wordt ingestort, maar dit is meestal een zeldzaam geval. Doe dit niet tenzij u een ontwerpbeperking hebt die het vereist.


1 door “een locatie waar tekstinhoud wordt verwacht”, bedoel ik in een element of geciteerde attribuutwaarde waarbij de normale parserende regels van toepassing zijn. Bijvoorbeeld: <p>HERE</p>OF <p title="HERE">...</p>. Wat ik boven schreef, is niet van toepassing op inhoud met speciale parservoringsregels of betekenis, zoals binnenkant van een script- of stijltag, of als een element of attribuutnaam. Bijvoorbeeld: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</style>, OF <p NOT-HERE="...">...</p>.

In deze contexten zijn de regels gecompliceerder en het is veel gemakkelijker om een ​​beveiligingsplicht te introduceren. Ik ontmoedig je sterk van het inbrengen van de dynamische inhoud in een van deze locaties. Ik heb teams gezien van competente beveiligingsbewuste ontwikkelaars die kwetsbaarheden introduceren door aan te nemen dat ze deze waarden correct hadden gecodeerd, maar een randcase missen. Er is meestal een veiliger alternatief, zoals het plaatsen van de dynamische waarde in een attribuut en vervolgens afhandelen met JavaScript.

Als het moet, lees dan de XSS-preventie van het Open Web Application Security Project Regelsom een aantal zorgen te begrijpen die u in gedachten moet houden.


Antwoord 2, autoriteit 6%

Het hangt af van de context. Enkele mogelijke contexten in HTML:

  • hoofdtekst van het document
  • binnen gemeenschappelijke kenmerken
  • binnen scripttags
  • binnen stijltags
  • meer!

Bekijk de Cross Site Scripting Prevention Cheatsheetvan OWASP, met name de “Waarom kan ik niet gewoon HTML Entiteit codeert niet-vertrouwde gegevens?” en “XSS-preventieregels” secties. Het is echter het beste om het hele document te lezen.


Antwoord 3, autoriteit 3%

Kortom, er zijn drie hoofdtekensdie altijd moeten worden ge-escaped in uw HTML- en XML-bestanden, zodat ze geen interactie hebben met de rest van de markeringen, dus zoals u waarschijnlijk verwacht, twee van dit worden de syntaxis-wrappers, die <> zijn, ze worden als volgt weergegeven:

1)  &lt; (<)
 2)  &gt; (>)
 3)  &amp; (&)

We kunnen ook dubbele aanhalingstekens (“) gebruiken als ” en het enkele aanhalingsteken (‘) als &apos

Vermijd het plaatsen van dynamische inhoud in <script>en <style>. Deze regels zijn niet voor hen van toepassing. Als u bijvoorbeeld JSON moet opnemen in een , vervang dan < met \x3c, het U+2028-teken met \u2028 en U+2029 met \u2029 na JSON-serialisatie.)

HTML Escape-tekens: Volledige lijst:
http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Dus je moet <, of & wanneer gevolgd door iets dat een tekenreferentie zou kunnen beginnen. Ook de regel op ampersands is de enige regel voor attributen tussen aanhalingstekens, aangezien het overeenkomende aanhalingsteken het enige is dat er een zal beëindigen. Maar als u de attribuutwaarde daar niet wilt beëindigen, laat u het aanhalingsteken achterwege.

Overschakelen naar UTF-8 betekent dat je je bestand opnieuw moet opslaan:

Het gebruik van de tekencodering UTF-8 voor uw pagina betekent dat u de noodzaak van:
de meeste ontsnappingen en werk gewoon met karakters. Houd er echter rekening mee dat om
verander de codering van uw document, het is niet genoeg om alleen te veranderen
de coderingsverklaring bovenaan de pagina of op de server. Jij
moet u uw document opnieuw opslaan in die codering. Voor hulp bij het begrijpen
hoe u dat doet met uw toepassing lees Codering instellen in web
toepassingen maken.

Onzichtbare of dubbelzinnige tekens:

Een bijzonder nuttige rol voor ontsnappingen is om tekens weer te geven die:
zijn onzichtbaar of dubbelzinnig in presentatie.

Een voorbeeld is het Unicode-teken U+200F RECHTS-NAAR-LINKS MARK. Dit
karakter kan worden gebruikt om de richting in bidirectionele tekst te verduidelijken
(bijv. bij gebruik van het Arabische of Hebreeuwse schrift). Het heeft geen grafische vorm,
het is echter moeilijk om te zien waar deze tekens zich in de
tekst, en als ze verloren gaan of vergeten zijn, kunnen ze onverwachte
resultaten tijdens latere bewerking. Met (of het numerieke teken)
reference equivalent ) maakt het in plaats daarvan heel gemakkelijk te herkennen
deze karakters.

Een voorbeeld van een dubbelzinnig teken is U+00A0 NO-BREAK SPACE. Dit
type spatie voorkomt regelafbreking, maar het ziet er net zo uit als alle andere
spatie bij gebruik als teken.   maakt het
vrij duidelijk waar dergelijke spaties in de tekst voorkomen.


Antwoord 4

Het exacte antwoord hangt af van de context. Over het algemeen mogen deze tekens niet aanwezig zijn (HTML 5.2 §3.2.4.2.5):

Tekstknooppunten en attribuutwaarden moeten Unicode-tekens bevatten, mogen geen U+0000-tekens bevatten, mogen geen permanent ongedefinieerde Unicode-tekens (niet-tekens) bevatten en mogen geen andere besturingstekens dan spatietekens bevatten. Deze specificatie bevat extra beperkingen voor de exacte waarde van tekstknooppunten en attribuutwaarden, afhankelijk van hun precieze context.

Voor elementen in HTML zijn de beperkingen van het tekstinhoudsmodel ook afhankelijk van het soort element. Bijvoorbeeld een “<” binnen een textarea-element hoeft niet te worden geëscaped in HTML, omdat textarea een onbewerkt tekstelement is.

Deze beperkingen zijn verspreid over de specificatie. EG, attribuutwaarden (§8.1.2.3 ) mag geen ambigue ampersand bevatten en zijn (I) leeg, (II) binnen enkele aanhalingstekens (en mogen dus geen U + 0027 apostrof-teken bevatten '), (III) binnen dubbele aanhalingstekens (mag geen u + 0022 aanhalingstekens bevatten ") of (IV) UNQUEPERED – met De volgende beperkingen:

… MOET geen letterlijke ruimtetekens bevatten, elke UL + 0022-aanhalingstekens (“), U + 0027 APOSTROFE-tekens (‘), U + 003D is gelijk aan tekenpersonages (=), U + 003C minder dan Teken tekens (& LT;), U + 003E groter dan tekenpersonages (& GT;) of U + 0060 graf accent tekens (`) en mogen niet de lege tekenreeks zijn.

Other episodes