Które znaki wymagają zmiany znaczenia w HTML?

251

Czy są takie same jak XML, być może plus spacja jeden (  )?

Znalazłem kilka ogromnych list znaków ucieczki HTML, ale nie sądzę, że trzeba ich unikać . Chcę wiedzieć, co trzeba uciec.

Ahmet
źródło

Odpowiedzi:

318

Jeśli wstawiasz treść tekstową w dokumencie w miejscu, w którym spodziewana jest treść tekstowa 1 , zwykle potrzebujesz tylko tych samych znaków, co w XML . Wewnątrz elementu obejmuje to tylko znak ucieczki bytu &i ogranicznik elementu znaki mniejsze niż i większe niż < >:

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

Wewnątrz wartości atrybutów musisz także uciec od znaku cudzysłowu, którego używasz:

" becomes &quot;
' becomes &#39;

W niektórych przypadkach może być bezpiecznie pominąć ucieczkę przed niektórymi z tych postaci, ale zachęcam do ucieczki ze wszystkich pięciu we wszystkich przypadkach, aby zmniejszyć ryzyko pomyłki.

Jeśli kodowanie dokumentu nie obsługuje wszystkich używanych znaków, na przykład jeśli próbujesz użyć emoji w dokumencie zakodowanym w formacie ASCII, musisz również je uciec. Większość dokumentów w tych dniach jest kodowana przy użyciu kodowania UTF-8 w pełni obsługującego Unicode, o ile nie będzie to konieczne.

Zasadniczo nie powinieneś uciekać przed spacjami jak &nbsp;. &nbsp;to nie jest normalna przestrzeń, to przestrzeń niezniszczalna . Możesz użyć ich zamiast zwykłych spacji, aby zapobiec wstawianiu linii między dwoma słowami lub wstawić dodatkową spację bez automatycznego zwinięcia, ale jest to zwykle rzadki przypadek. Nie rób tego, chyba że masz ograniczenia projektowe, które tego wymagają.


1 Przez „lokalizację, w której spodziewana jest treść tekstowa”, mam na myśli wnętrze elementu lub wartości atrybutu cytowanego, w których obowiązują normalne reguły analizy. Na przykład: <p>HERE</p>lub <p title="HERE">...</p>. To, co napisałem powyżej , nie dotyczy treści, które mają specjalne reguły analizowania lub znaczenie, takie jak wewnątrz skryptu lub znacznika stylu, lub jako nazwa elementu lub atrybutu. Na przykład: <NOT-HERE>...</NOT-HERE>, <script>NOT-HERE</script>, <style>NOT-HERE</script>, lub <p NOT-HERE="...">...</p>.

W tych kontekstach reguły są bardziej skomplikowane i znacznie łatwiej jest wprowadzić lukę w zabezpieczeniach. Zdecydowanie odradzam wam wstawianie dynamicznych treści w dowolne z tych lokalizacji. Widziałem zespoły kompetentnych, świadomych bezpieczeństwa programistów, wprowadzających luki w zabezpieczeniach, zakładając, że poprawnie zakodowali te wartości, ale brakuje im marginalnego przypadku. Zwykle istnieje bezpieczniejsza alternatywa, taka jak umieszczenie wartości dynamicznej w atrybucie, a następnie obsługa jej za pomocą JavaScript.

Jeśli musisz, przeczytaj Zasady zapobiegania XSS Open Web Application Security Project, aby zrozumieć niektóre z obaw, o których należy pamiętać.

Jeremy Banks
źródło
2
Niektóre wartości atrybutów HTML mogą również mieć specjalne znaczenie (JS / CSS). Nie dotyczy to również tych, na przykład: <p onclick="NOT-HERE">...</p>i <p style="NOT-HERE">...</p>.
geekley,
21

To zależy od kontekstu. Niektóre możliwe konteksty w HTML:

  • treść dokumentu
  • wewnątrz wspólnych atrybutów
  • wewnątrz znaczników skryptu
  • wewnątrz tagów stylu
  • jeszcze kilka!

Zobacz sekcję OWASP dotyczącą zapobiegania skryptom między witrynami , zwłaszcza sekcje „ Dlaczego nie mogę po prostu encji HTML zakodować niezaufanych danych? ” I „ Zasady zapobiegania XSS ”. Jednak najlepiej przeczytać cały dokument.

daxelrod
źródło
9

Zasadniczo istnieją trzy główne znaki, które zawsze powinny być poprzedzane znakami ucieczki w plikach HTML i XML, więc nie wchodzą one w interakcję z resztą znaczników, więc jak można się spodziewać, dwa z nich będą opakowaniami składni, które są < >, są one wymienione poniżej:

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

Możemy również użyć podwójnego cudzysłowu („) jako”, a pojedynczego cudzysłowu (') jako & apos

Unikaj umieszczania treści dynamicznych w <script>i <style>. Te zasady nie są dla nich stosowane. Na przykład, jeśli musisz dołączyć JSON do a, zamień <na \ x3c, znak U + 2028 na \ u2028, a U + 2029 na \ u2029 po serializacji JSON).

Znaki ucieczki HTML: pełna lista: http://www.theukwebdesigncompany.com/articles/entity-escape-characters.php

Musisz więc uciec <lub, po którym następuje cokolwiek, co mogłoby rozpocząć odniesienie do postaci. Również reguła na znakach handlowych jest jedyną taką regułą dla atrybutów cytowanych, ponieważ pasujący znak cudzysłowu jest jedyną rzeczą, która ją zakończy. Ale jeśli nie chcesz tam kończyć wartości atrybutu, unikaj cudzysłowu.

Zmiana na UTF-8 oznacza ponowne zapisanie pliku:

użycie kodowania znaków UTF-8 dla twojej strony oznacza, że ​​możesz uniknąć potrzeby większości znaków ucieczki i po prostu pracować ze znakami. Pamiętaj jednak, że aby zmienić kodowanie dokumentu, nie wystarczy zmienić deklarację kodowania na górze strony lub na serwerze. Musisz ponownie zapisać dokument w tym kodowaniu. Aby dowiedzieć się, jak to zrobić w aplikacji, przeczytaj temat Ustawianie kodowania w aplikacjach do tworzenia stron internetowych.

Niewidoczne lub niejednoznaczne znaki:

Szczególnie użyteczną rolą ucieczek jest reprezentowanie postaci, które są niewidoczne lub niejednoznaczne w prezentacji.

Jednym z przykładów może być znak Unicode U + 200F PRAWO DO LEWEGO ZNAKU. Tego znaku można użyć do wyjaśnienia kierunkowości w tekście dwukierunkowym (np. Przy użyciu skryptów arabskich lub hebrajskich). Nie ma jednak formy graficznej, więc trudno jest zobaczyć, gdzie te znaki są w tekście, a jeśli zostaną zagubione lub zapomniane, mogą przynieść nieoczekiwane rezultaty podczas późniejszej edycji. Użycie (lub jego odpowiednika numerycznego) zamiast tego bardzo ułatwia wykrycie tych znaków.

Przykładem niejednoznacznego znaku jest U + 00A0 PRZESTRZEŃ BEZ PRZERWY. Ten typ spacji zapobiega łamaniu linii, ale wygląda jak każda inna spacja, gdy jest używana jako znak. Użycie powoduje, że jest całkiem jasne, gdzie takie miejsca pojawiają się w tekście.

Alireza
źródło
3

Dokładna odpowiedź zależy od kontekstu. Zasadniczo znaki te nie mogą być obecne ( HTML 5.2 §3.2.4.2.5 ):

Węzły tekstowe i wartości atrybutów muszą składać się ze znaków Unicode, nie mogą zawierać znaków U + 0000, nie mogą zawierać trwale niezdefiniowanych znaków Unicode (innych niż znaki) i nie mogą zawierać znaków sterujących innych niż znaki spacji. Ta specyfikacja zawiera dodatkowe ograniczenia dotyczące dokładnej wartości węzłów tekstowych i wartości atrybutów w zależności od ich dokładnego kontekstu.

W przypadku elementów w HTML ograniczenia modelu zawartości tekstu zależą również od rodzaju elementu. Na przykład „<” w elemencie textarea nie musi być poprzedzany znakami ucieczki w HTML, ponieważ textarea jest surowym elementem tekstowym, który można oddzielić.

Ograniczenia te są rozproszone w specyfikacji. Np. Wartości atrybutów ( pkt 8.1.2.3 ) nie mogą zawierać niejednoznacznych znaków ampersand i muszą być (i) puste, (ii) w pojedynczych cudzysłowach (a zatem nie mogą zawierać znaku U + 0027 APOSTROPHE '), (iii) w podwójnych cudzysłowach ( nie może zawierać znaku U + 0022 QUOTATION MARK ") lub (iv) bez cudzysłowu - z następującymi ograniczeniami:

... nie może zawierać literalnych znaków spacji, żadnych znaków U + 0022 ZNAK QUOTACJI ("), znaków U + 0027 APOSTROPHE ('), znaków U + 003D EQUALS SIGN (=), znaków U + 003C LESS-THAN SIGN ( <), U + 003E znaki WIĘKSZY NIŻ SIGN (>) lub U + 0060 GRAVE ACCENT znaków (`) i nie może być pustym ciągiem.

Andrey
źródło