Odpowiedzi:
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
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:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
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.
'
nie używaj '
. Jeśli z jakiegokolwiek powodu użyjesz pojedynczych cudzysłowów dla atrybutu HTML, tak jak title='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.
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.
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2) losowanie odpowiedzi: Nie zakodowane.
But I don't believe it is, in general, necessary.
(3) Komentarz Toma do odpowiedzi nitro2k01: Zakodowany.
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
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ć '
.
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
:
string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
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.
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.
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.
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
Jeśli apostrof należy do treści, unikaj go. Wszelkie inne znaki treści, które można pomylić z kodem, unikaj go.
Najłatwiejszym sposobem wykonania zadania bez użycia rzeczywistej jednostki jest użycie PHP htmlentities()
lub htmlspecialchars()
funkcji:
$val = htmlspecialchars("Don't", ENT_QUOTES, 'UTF-8');
if($_POST){
$val = htmlspecialchars(trim($_POST['val']), ENT_QUOTES, 'UTF-8');
}
echo "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='en' lang='en' class='njs'>
<head>
<meta http-equiv='Content-type' content='text/html;charset=utf-8' />
<title>Special Characters</title>
<style type='text/css'>
@import 'special.css';
</style>
</head>
<body>
<form method='post' action='' id='fm' name='fm'>
<input type='text' value='$val' name='val' id='val' />
<input type='submit' value='submit' name='sub' id='sub' />
</form>
</body>
<script type='text/javascript' src='special.js'></script>
</html>";
&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.