Должен ли я избегать символа Apostrophe (') с его сущностью HTML (& # 39;)?
Какие символы должны быть экранированы с помощью своих объектов HTML. Например, &
выполняется с помощью &
.
Если '
будет экранирован с помощью & # 39;
?
7 ответов
У меня нет привилегий для комментариев, иначе я бы оставил это как комментарий к более раннему ответу.
НЕ, я повторяю, НЕ избегайте апострофа в HTML, используя
& амп; APOS;
Это не действительная ссылка сущности HTML-символа. Это ссылка на объект XML-символа. Хотя Firefox и Chrome, по крайней мере, сделают это выше как апостроф в HTML-документе, Internet Explorer этого не сделает. И это соответствует стандарту, когда он отказывается это делать.
Вы можете избежать апострофа в HTML, используя
& амп; # 39;
Но я не считаю, что это вообще необходимо.
http://fishbowl.pastiche.org/2003/07/01/the_curse_of_apos/
http://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references
Я не согласен с Нейтом. В идеале вы должны использовать как можно меньше возможностей и использовать UTF-8 для выражения символов изначально. Для этого вам нужен редактор, который может обрабатывать UTF-8, а также правильное объявление набора символов, например:
<meta http-equiv = "Content-Type" content = "text /html; charset = UTF-8" />
Однако вы должны сделать привычкой избегать символов, которые имеют особое значение в (X) HTML, а именно:
& л; & Амп; л;
> & Амп; GT;
"& quot;
& Амп; & Амп; амп;
'& # 39;
Это позволит вам не случайно писать разметку, когда вы хотите написать эти символы. Это особенно важно для ввода пользователей, для обеспечения безопасности. Это менее очевидно, но на самом деле важно избежать "
. Если строка когда-либо заканчивается атрибутом HTML (title =" something "
и т. Д.), Пользователь может завершить атрибут и вставить свою собственную разметку. Представьте, что произойдет, если пользователь вводит "onclick =" alert ('hello');
, и вы вставляете это в title = "..."
Если вы используете PHP, вы можете использовать функцию htmlspecialchars
, чтобы сделать это. Другие языки могут иметь другие подобные функции.
Обновление: Я поддерживаю исправление проблемы. Проклятый ядовитый IE.
Это зависит от вашего варианта использования, но нам, вероятно, следует избегать использования '
на естественном языке вообще, поэтому проблема не должна возникать, если у вас нет компьютерного кода в вашем XML.
В тех случаях, когда мы переводим строки, мы обнаруживаем, что некоторые переводчики заменяют закрывающие кавычки на фигурные кавычки юникодом, но оставляют прямые кавычки в качестве котировок открытия, оставляя их визуально неуравновешенными и выглядящими непрофессиональными.
Юникодовые символы â € ~
и â € ™
должны заменять '
, где это возможно, так же, как â € œ
и â €
должен заменить "
. Это полезно, потому что компьютеры не распознают курчавую пунктуацию как специальную. (Хотя я рад видеть, что Stack Overflow /Chrome считает, что «ошибка» является ошибкой орфографии, тогда как она довольна «кодом» <)
Это не помогает нам иметь очень привлекательные символы '
и "
на клавиатуре.
Итак, давайте посмотрим, сам ли StackExchange кодирует апостроф, используя объект HTML.
Вот несколько примеров из исходного кода этой страницы.
(1) Заголовок вопроса: закодирован.
Должен ли я избежать символа Apostrophe (& # 39;) с его объектом HTML (& # 39;)?
(2) Ответ на вызов: не закодирован.
Но я не считаю, что это вообще необходимо.
(3) Комментарий Тома на ответ nitro2k01: закодирован.
У меня есть два противоречащих ответа. Рекомендуется избегать & # 39; а другой нет. Во что я должен верить?
Итак, это происходит в обоих направлениях.
Однако исходный код этой страницы никогда не использует & apos;
. Все кодировки имеют вид & # 39;
. Это согласуется с нитро2k01 и советом не использовать &
.
Где идет эта строка?
Ваш ответ зависит от контекста:
-
Если вы пишете абзац в HTML с этими данными, этого может быть достаточно, чтобы избежать & lt ;,> и &:
& л; р > {строка} & л; /р >
-
Если вы пишете в атрибут HTML, тем не менее, например
<a href = '/some /path /{string}'> ... </a>
Тогда вы должны полностью избежать апострофа. Это может быть вектор атаки, если злоумышленник помещает это для строки :
string = "'onmouseover =' alert (\" неприятный скрипт здесь! \ ") 'data-ignore ='"
-
То же самое касается двойных кавычек. Я даже читал, что обратная сторона `уязвима, поскольку она также может использоваться для атрибутов HTML. Если у вас нет сценария автоматической проверки синтаксиса HTML как часть ваших процедур развертывания, предположите, что любой из этих трех может быть использован и должен быть экранирован для атрибутов HTML.
-
В крайнем случае допустимы даже некотируемые атрибуты, поэтому символу пробега также потребуется экранирование. И
!
,@
,$
,%
,(
,))
,=
,+
,{
,}
,[
, и]
, все из которых могут выйти из атрибута и разрешить вставку нового.
Что я делаю
Чтобы выполнить экранирование в JavaScript, я использую JQuery $ (element) .text (string)
или $ (element) .attr (attrname, string)
, чтобы сделать убегая от меня. Будьте очень осторожны с $ (element) .html (unsafe)
, который не ускользнет от вашего HTML!
В серверном коде я должен тщательно оценить риск для каждого случая и внимательно прочитать документацию. Это будет зависеть от конкретного языка и библиотек, которые вы используете, таких как Rails, Django, raw PHP, Drupal и т. Д.
Базы данных
Если вы планируете как можно раньше остановить проблему, прежде чем она попадет в вашу базу данных, держите лошадей. HTML-экранирование текста, хранящегося в вашей БД, может привести вас к адской поездке. Что делать, если позже вы захотите разрешить определенные HTML-теги, но не другие, такие как курсив, жирный шрифт, цвета и таблицы? Что, если вы пропустили что-то в своем первом проходе, но ваш escaper уже избежал &
как & amp;
и "
как & ,
? Будет ли он превращаться в & amp;
и & quot;
?
Мой подход заключается только в том, чтобы выполнять SQL-экранирование для базы данных, но оставлять все специальные символы HTML для последующей обработки. Таким образом, я могу легко отлаживать и точно настраивать мои HTML-экраны. Разум, это также означает, что я не могу доверять своим собственным таблицам SQL, если у них есть строки, предоставленные пользователем.
Мораль
Никогда не доверяйте управляемому пользователем вводу и всегда указывайте свои HTML-атрибуты!
На основе: Есть больше возможностей для HTML, чем & amp ;, & lt ;, & gt ;, и Райан Гроув
Если ваш апостроф принадлежит к содержанию, избегайте его. Любые другие символы содержимого, которые можно путать с кодом, избежать его.
Самый простой способ выполнить работу без использования фактического объекта - использовать функции PHP htmlentities ()
или htmlspecialchars ()
:
$ val = htmlspecialchars ("Do not", ENT_QUOTES, 'UTF-8');
если ($ _ POST) {
$ val = htmlspecialchars (обрезка ($ _ 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'>
& Lt; & головка GT;
<meta http-equiv = 'Content-type' content = 'text /html; charset = utf-8' />
<title> Специальные символы </title>
<style type = 'text /css'>
@import 'special.css';
& Lt; /тип >
& Lt; /головка >
& Л; тело >
<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' />
& Lt; /форма >
& Lt; /тело >
<script type = 'text /javascript' src = 'special.js'> </script>
& Lt; /HTML > ";