Должен ли я экранировать символ Апостроф (') с его сущностью HTML (& # 39;)?

38

Какие символы следует экранировать с помощью их HTML-сущностей. Например, &экранируется с &.

Должен ли 'быть сбежал с '?

Том
источник

Ответы:

41

У меня нет прав на комментарии, или я бы оставил это как комментарий к более раннему ответу.

НЕ, повторяю, НЕ избегайте апострофа в HTML, используя

'

Это недопустимая ссылка на сущность символа HTML. Это ссылка на символьную сущность XML. Хотя Firefox и Chrome, по крайней мере, отобразят вышеприведенное как апостроф в HTML-документе, Internet Explorer этого не сделает. И он следует стандарту, когда отказывается это сделать.

Вы можете избежать апострофа в HTML, используя

'

Но я не верю, что это вообще необходимо.

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, теперь она действительна для HTML5. Тем не менее, если вам нужно поддерживать устаревшие браузеры или писать электронные письма в формате HTML для Outlook, то вам лучше всего придерживаться этого, 'если вы считаете необходимым избежать экранирования персонажа.
Томхьюз
24

Я не согласен с Нейтом. В идеале вы должны использовать как можно меньше экранирования и использовать UTF-8 для естественного выражения символов. Для этого вам нужен редактор, который может обрабатывать UTF-8, а также правильное объявление charset, например:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Тем не менее, вы должны сделать это привычкой избегать символов, которые имеют особое значение в (X) HTML, а именно:

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

Это позволит вам не случайно писать разметку, когда вы хотите написать эти символы. Это особенно важно для пользовательского ввода, для поддержания безопасности. Это менее очевидно, но на самом деле важно сбежать ". Если строка когда-либо заканчивается атрибутом HTML ( title="something"и т. Д.), Пользователь может завершить атрибут и вставить собственную разметку. Представьте, что произойдет, если пользователь войдет, " onclick="alert('hello');и вы вставите это вtitle="..."

Если вы используете PHP, вы можете использовать htmlspecialcharsфункцию для этого. Другие языки могут иметь другие подобные функции.

Обновление: я исправлен в вопросе об апосе. Чертовски надоедливый ИП.

nitro2k01
источник
Теперь у меня есть два противоречивых ответа. Один рекомендует убегать, а другой нет. Во что мне верить?
Том
7
Короче. Вы можете или не можете избежать этого по своему усмотрению. Если вы делаете, &#39;не используйте &apos;. Если по какой-либо причине вы используете одинарные кавычки для атрибута HTML, например, title='something'вы должны явно избегать любых одинарных кавычек внутри этого значения атрибута.
nitro2k01
Ваш второй абзац - это то, что важно для меня, мое ОКР перешло в перегрузку, когда я увидел красные фрагменты текста в моем коммите git из-за неиспользованных
eballeste
6

Это зависит от вашего варианта использования, но мы, вероятно, не должны использовать его 'на естественном языке, поэтому проблема не должна возникать, если у вас нет компьютерного кода в XML.

Когда мы переводим строки, мы обнаруживаем, что некоторые переводчики заменяют заключительные кавычки на фигурные кавычки в юникоде, но оставляют прямые кавычки в качестве вводных, оставляя их визуально несбалансированными и выглядящими непрофессионально.

Символы Юникод и должны заменить, 'где это возможно, столько, сколько и должны заменить ". Это полезно, потому что компьютеры не распознают фигурные знаки препинания как особые. (Хотя я удивлен, увидев, что Stack Overflow / Chrome считает « don’t» орфографической ошибкой, тогда как «доволен don't».)

Это не помогает, что у нас есть очень заманчивые 'и "символы прямо на клавиатуре.

android.weasel
источник
1

Итак, давайте посмотрим, кодирует ли StackExchange сам апостроф с помощью сущности HTML.

Вот несколько примеров из исходного кода этой страницы.

(1) Название вопроса: Закодировано.

Should I escape the Apostrophe ( &#39; ) character with its HTML entity (&amp;#39;)?

(2) ответ Дрю: не закодировано.

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

(3) Комментарий Тома к ответу nitro2k01: Закодировано.

I&#39;ve got two contradicting answers now. One recommends escaping &#39; and the other does not. What should I believe?

Так что это идет в обе стороны.

Тем не менее, исходный код этой страницы никогда не использует &apos;. Все кодировки имеют форму &#39;. Это соответствует nitro2k01 и совету Дрю не использовать &apos;.

jkdev
источник
1
Хотя во всех трех случаях его не нужно кодировать HTML.
MrWhite
1

Куда идет эта строка?

Ваш ответ зависит от контекста:

  1. Если вы пишете абзац в HTML с этими данными, вам может быть достаточно экранировать <,> и &:

    <p>{string}</p>

  2. Если вы пишете в атрибут HTML, хотя, как

    <a href='/some/path/{string}'>...</a>

Тогда вы должны полностью избежать апостроф. Это может быть вектор атаки, если злоумышленник вставил это для string:

string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
  1. То же самое касается двойных кавычек. Я даже читал, что backtick `уязвим, поскольку его можно использовать и для атрибутов HTML. Если у вас нет скрипта автоматической проверки синтаксиса HTML как части ваших процедур развертывания, предположите, что любой из этих трех может быть использован и должен быть экранирован для атрибутов HTML.

  2. В крайнем случае, даже не заключенные в кавычки атрибуты действительны, поэтому пробелу также необходимо экранировать. И !, @, $, %, (, ), =, +, {, }, [, и ], все из которых могут выйти из атрибута и позволяет вставить новый.

Что я делаю

Чтобы сделать побег в JavaScript, я использую JQuery $(element).text(string)или $(element).attr(attrname, string)для меня. Будьте очень осторожны с тем $(element).html(unsafe), что не ускользнет от вашего HTML!

Что касается серверного кода, я должен тщательно оценить риск для каждого случая и внимательно прочитать документацию. Это будет зависеть от конкретного языка и используемых вами библиотек, таких как Rails, Django, raw PHP, Drupal и т. Д.

Базы данных

Если вы планируете остановить проблему как можно раньше, прежде чем она попадет в вашу базу данных, держите лошадей. HTML-экранирование текста, хранящегося в вашей БД, может привести вас к адской поездке. Что если позже вы захотите разрешить определенные теги HTML, но не разрешать другие, такие как курсив, полужирный шрифт, цвета и таблицы? Что, если вы что-то пропустили во время первого прохода, но ваш побег уже сбежал &как &amp;и "как &quot;? Это превратит те в &amp;amp;и &amp;quot;?

Мой подход заключается в том, чтобы выполнять только экранирование SQL для базы данных, но оставить все специальные символы HTML для последующей обработки. Таким образом, я могу легко отлаживать и настраивать экранирование HTML. Имейте в виду, это также означает, что я не могу доверять своим собственным таблицам SQL, если они имеют предоставленные пользователем строки.

моральный

Никогда не доверяйте вводимым пользователем данным и всегда цитируйте свои атрибуты HTML!

Основано на: есть нечто большее, что может избежать HTML, чем &, <,> и " Райан Гроув

Хаим-Лейб Хальберт
источник
-1

Если ваш апостроф принадлежит контенту, избегайте его. Любые другие символы содержимого, которые можно спутать с кодом, избегайте его.

солнце
источник
«Если ваш апостроф принадлежит контенту, избегайте его». - Это может показаться неправильным (как будто пропущено слово «не»). Если апостроф является частью контента, не избегайте его - в этом не должно быть необходимости.
MrWhite
-4

Самый простой способ выполнить работу без фактической сущности - это использовать PHP htmlentities()или htmlspecialchars()функции:

$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>";
TheCongregation
источник
4
Это шутка?
Su '17
@ Су 'Боюсь, что нет ...
Уильям Эдвардс,