Czy powinienem uciec od znaku Apostrophe (') z jego jednostką HTML (& # 39;)?


38

Jakie znaki powinny być poprzedzane znakami ucieczki za pomocą ich encji HTML. Na przykład &ucieka się za pomocą &.

Czy 'należy uciec '?

Odpowiedzi:


41

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


Rozumiem, że to będzie poprawne, kiedy to zostanie opublikowane, jednak patrząc na artykuł w Wikipedii wydaje się, że &aposjest 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.
tomhughes

24

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:

< &lt;
> &gt;
" &quot;
& &amp;
' &#39;

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ć htmlspecialcharsfunkcji, aby to zrobić. Inne języki mogą mieć inne podobne funkcje.

Aktualizacja: Naprawiono problem z apos. Cholernie nieznośny IE.


Mam teraz dwie sprzeczne odpowiedzi. Jeden zaleca ucieczkę, a drugi nie. W co mam wierzyć?
Tom

7
W skrócie. Możesz, ale nie musisz, uciec przed tym według własnego uznania. Jeśli tak, &#39;nie używaj &apos;. 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.
nitro2k01 18.04.11

wasz drugi akapit jest dla mnie ważny, moja OCD włączyła się w przesterowanie, gdy zobaczyłem czerwone paczki tekstu w moim git commit z powodu nieokreślonych
eballeste

6

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.


1

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 ( &#39; ) character with its HTML entity (&amp;#39;)?

(2) losowanie odpowiedzi: Nie zakodowane.

But I don't believe it is, in general, necessary.

(3) Komentarz Toma do odpowiedzi nitro2k01: Zakodowany.

I&#39;ve got two contradicting answers now. One recommends escaping &#39; 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 &apos;. Wszystkie kodowania mają formę &#39;. Jest to zgodne z nitro2k01 i zaleceniami drawa, aby nie używać &apos;.


1
Chociaż we wszystkich 3 przypadkach nie musi być kodowany HTML.
MrWhite

1

Gdzie idzie ten sznur?

Twoja odpowiedź zależy od kontekstu:

  1. Jeśli piszesz akapit w HTML z tymi danymi, może być wystarczające, aby uciec <,> i &:

    <p>{string}</p>

  2. 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='"
  1. 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.

  2. 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 &amp;i "jako &quot;? Czy zmieni to w &amp;amp;i &amp;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


-1

Jeśli apostrof należy do treści, unikaj go. Wszelkie inne znaki treści, które można pomylić z kodem, unikaj go.


„Jeśli twój apostrof należy do treści, uciekaj od niego”. - Wydaje się to niepoprawne (jakby brakowało słowa „nie”). Jeśli apostrof jest częścią treści, nie unikaj go - nie powinno być takiej potrzeby.
MrWhite

-4

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>";

4
Czy to żart?
Su

@Su „Obawiam się, że to nie jest…
William Edwards,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.