Jakie znaki powinny być poprzedzane znakami ucieczki za pomocą ich encji HTML. Na przykład &
ucieka się za pomocą &
.
Czy '
należy uciec '
?
Nie mam uprawnień do komentowania lub pozostawiłbym to jako komentarz do wcześniejszej odpowiedzi.
NIE powtarzam, NIE uciekaj apostrofowi w HTML za pomocą
'
To nie jest prawidłowe odwołanie do encji znaków HTML. Jest to odwołanie do encji znakowej XML. Podczas gdy Firefox i Chrome przynajmniej renderują powyższe jako apostrof w dokumencie HTML, Internet Explorer nie. I przestrzega standardu, gdy odmawia.
Możesz uciec od apostrofu w HTML za pomocą
'
Ale nie wierzę, że jest to ogólnie konieczne.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
&apos
jest teraz poprawny HTML5. Biorąc to pod uwagę, jeśli musisz obsługiwać starsze przeglądarki lub pisać e-maile HTML dla programu Outlook, najlepiej trzymać się,'
jeśli uważasz, że konieczne jest ucieczkę od postaci.Nie zgadzam się z Nate'em. Najlepiej jest używać jak najmniejszej liczby znaków ucieczki i używać UTF-8 do natywnego wyrażania znaków. Aby to zrobić, potrzebujesz edytora obsługującego UTF-8, a także poprawnej deklaracji zestawu znaków, takiej jak:
Powinieneś jednak przyzwyczaić się do unikania znaków, które mają specjalne znaczenie w (X) HTML, a mianowicie:
Dzięki temu nie będziesz przypadkowo pisać znaczników, gdy chcesz pisać te znaki. Jest to szczególnie ważne w przypadku wprowadzania danych przez użytkownika, aby zachować bezpieczeństwo. To mniej oczywiste, ale tak naprawdę ważne jest, aby uciec
"
. Jeśli łańcuch kiedyś kończy się atrybutem HTML (title="something"
itp.), Użytkownik może zakończyć atrybut i wstawić własny znacznik. Wyobraź sobie, co się stanie, jeśli użytkownik wejdzie" onclick="alert('hello');
i wstawisz to dotitle="..."
Jeśli używasz PHP, możesz użyć
htmlspecialchars
funkcji, aby to zrobić. Inne języki mogą mieć inne podobne funkcje.Aktualizacja: Naprawiono problem z apos. Cholernie nieznośny IE.
źródło
'
nie używaj'
. Jeśli z jakiegokolwiek powodu użyjesz pojedynczych cudzysłowów dla atrybutu HTML, tak jaktitle='something'
oczywiście musisz uciec przed pojedynczymi cudzysłowami wewnątrz wartości atrybutu.To zależy od twojego przypadku użycia, ale prawdopodobnie powinniśmy być zniechęceni do używania
'
ogólnie w języku naturalnym, więc problem nie powinien powstać, chyba że masz kod komputerowy w pliku XML.Tam, gdzie mamy przetłumaczone ciągi, okazuje się, że niektórzy tłumacze zastępują cytaty zamykające ułamkowymi cytatami unicode, ale pozostawiają proste cytaty jako cytaty otwierające, pozostawiając ich wizualnie niezrównoważonymi i wyglądającymi nieprofesjonalnie.
Znaki Unicode
‘
i’
powinny zastępować w'
miarę możliwości, podobnie jak“
i”
powinny zastępować"
. Jest to przydatne, ponieważ komputery nie rozpoznają nawiasów interpunkcyjnych jako specjalnych. (Chociaż jestem rozbawiony tym, że Stack Overflow / Chrome uważa „don’t
” za błąd ortograficzny, podczas gdy jest zadowolony z „don't
”).To nie pomaga, że mamy bardzo kuszące
'
i"
znaki bezpośrednio na klawiaturze.źródło
Zobaczmy więc, czy StackExchange koduje apostrof używając encji HTML.
Oto kilka przykładów z kodu źródłowego tej strony.
(1) Tytuł pytania: zakodowany.
(2) losowanie odpowiedzi: Nie zakodowane.
(3) Komentarz Toma do odpowiedzi nitro2k01: Zakodowany.
Tak dzieje się w obie strony.
Jednak kod źródłowy tej strony nigdy nie używa
'
. Wszystkie kodowania mają formę'
. Jest to zgodne z nitro2k01 i zaleceniami drawa, aby nie używać'
.źródło
Gdzie idzie ten sznur?
Twoja odpowiedź zależy od kontekstu:
Jeśli piszesz akapit w HTML z tymi danymi, może być wystarczające, aby uciec <,> i &:
<p>{string}</p>
Jeśli piszesz w atrybucie HTML, na przykład
<a href='/some/path/{string}'>...</a>
Zatem powinniście absolutnie uciec od apostrofu. Może to być wektor ataku, jeśli atakujący umieści to w
string
:To samo dotyczy podwójnych cytatów. Czytałem nawet, że backtick `jest podatny na atak, ponieważ można go również wykorzystać w przypadku atrybutów HTML. Jeśli nie masz automatycznego skryptu sprawdzającego składnię HTML w ramach procedur wdrażania, załóż, że można użyć któregokolwiek z tych trzech elementów i należy je zmienić dla atrybutów HTML.
W skrajności, nawet niecytowane atrybuty są poprawne, więc znak spacji również musiałby uciekać. I
!
,@
,$
,%
,(
,)
,=
,+
,{
,}
,[
, i]
, z których każdy może wyrwać się z atrybutu i umożliwić wstawienie nowego.Co robię
Aby zrobić ucieczkę w JavaScript, używam JQuery's
$(element).text(string)
lub$(element).attr(attrname, string)
dla mnie. Bądź bardzo ostrożny$(element).html(unsafe)
, ponieważ nie ucieka Ci Twój HTML!W przypadku kodu po stronie serwera muszę dokładnie oszacować ryzyko dla każdej sprawy i dokładnie przeczytać dokumentację. Będzie to zależeć od konkretnego języka i używanych bibliotek, takich jak Rails, Django, raw PHP, Drupal itp.
Bazy danych
Jeśli zastanawiasz się nad zatrzymaniem problemu tak wcześnie, jak to możliwe, zanim dotrze on nawet do bazy danych, trzymaj swoje konie. Użycie kodu HTML w tekście zapisanym w bazie danych może zabrać Cię do piekielnej jazdy. Co jeśli później chcesz zezwolić na niektóre tagi HTML, ale nie inne, takie jak kursywa, pogrubienie, kolory i tabele? Co jeśli nie zauważyłeś czegoś w pierwszym przejściu, ale twój uciekinier już uciekł
&
jako&
i"
jako"
? Czy zmieni to w&amp;
i&quot;
?Podejście polega na wykonywaniu zmiany znaczenia SQL tylko dla bazy danych, ale pozostawianie wszystkich znaków specjalnych HTML w celu późniejszego przetworzenia. W ten sposób mogę łatwo debugować i dostrajać moje kody ucieczki HTML. Pamiętaj, że oznacza to również, że nie mogę ufać własnym tabelom SQL, jeśli zawierają one ciągi dostarczone przez użytkownika.
Morał
Nigdy nie ufaj wejściom kontrolowanym przez użytkownika i zawsze podawaj swoje atrybuty HTML!
Na podstawie: Ucieczka HTML to coś więcej niż &, <,> i „ Ryan Grove
źródło
Jeśli apostrof należy do treści, unikaj go. Wszelkie inne znaki treści, które można pomylić z kodem, unikaj go.
źródło
Najłatwiejszym sposobem wykonania zadania bez użycia rzeczywistej jednostki jest użycie PHP
htmlentities()
lubhtmlspecialchars()
funkcji:źródło