Должен ли я избегать символа Apostrophe (') с его сущностью HTML (& # 39;)?

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

Если ' будет экранирован с помощью & # 39;?

35 голосов | спросил Tom 16 PMpSat, 16 Apr 2011 20:16:58 +040016Saturday 2011, 20:16:58

7 ответов


37

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

НЕ, я повторяю, НЕ избегайте апострофа в 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

ответил drew 17 AMpSun, 17 Apr 2011 07:35:10 +040035Sunday 2011, 07:35:10
21

Я не согласен с Нейтом. В идеале вы должны использовать как можно меньше возможностей и использовать 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.

ответил nitro2k01 16 PMpSat, 16 Apr 2011 23:43:26 +040043Saturday 2011, 23:43:26
5

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

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

Юникодовые символы â € ~ и â € ™ должны заменять ', где это возможно, так же, как â € œ и â € должен заменить ". Это полезно, потому что компьютеры не распознают курчавую пунктуацию как специальную. (Хотя я рад видеть, что Stack Overflow /Chrome считает, что «ошибка» является ошибкой орфографии, тогда как она довольна «кодом» <)

>

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

ответил android.weasel 15 PMpTue, 15 Apr 2014 17:42:46 +040042Tuesday 2014, 17:42:46
1

Итак, давайте посмотрим, сам ли StackExchange кодирует апостроф, используя объект HTML.

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

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

Должен ли я избежать символа Apostrophe (& # 39;) с его объектом HTML (& # 39;)?

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

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

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

У меня есть два противоречащих ответа. Рекомендуется избегать & # 39; а другой нет. Во что я должен верить?

Итак, это происходит в обоих направлениях.

Однако исходный код этой страницы никогда не использует & apos;. Все кодировки имеют вид & # 39;. Это согласуется с нитро2k01 и советом не использовать &.

ответил jkdev 10 22015vEurope/Moscow11bEurope/MoscowTue, 10 Nov 2015 22:30:59 +0300 2015, 22:30:59
1

Где идет эта строка?

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

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

    & л; р > {строка} & л; /р >

  2. Если вы пишете в атрибут HTML, тем не менее, например

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

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

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

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

Что я делаю

Чтобы выполнить экранирование в 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 ;, и Райан Гроув

ответил Chaim-Leib Halbert 14 +03002016-10-14T00:05:14+03:00312016bEurope/MoscowFri, 14 Oct 2016 00:05:14 +0300 2016, 00:05:14
-1

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

ответил Sun 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 11 Sep 2014 12:15:36 +0400 2014, 12:15:36
-4

Самый простой способ выполнить работу без использования фактического объекта - использовать функции 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 > ";
ответил TheCongregation 17 +04002012-10-17T06:01:00+04:00312012bEurope/MoscowWed, 17 Oct 2012 06:01:00 +0400 2012, 06:01:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132