Ответы:
У меня нет прав на комментарии, или я бы оставил это как комментарий к более раннему ответу.
НЕ, повторяю, НЕ избегайте апострофа в 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
Я не согласен с Нейтом. В идеале вы должны использовать как можно меньше экранирования и использовать UTF-8 для естественного выражения символов. Для этого вам нужен редактор, который может обрабатывать UTF-8, а также правильное объявление charset, например:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Тем не менее, вы должны сделать это привычкой избегать символов, которые имеют особое значение в (X) HTML, а именно:
< <
> >
" "
& &
' '
Это позволит вам не случайно писать разметку, когда вы хотите написать эти символы. Это особенно важно для пользовательского ввода, для поддержания безопасности. Это менее очевидно, но на самом деле важно сбежать "
. Если строка когда-либо заканчивается атрибутом HTML ( title="something"
и т. Д.), Пользователь может завершить атрибут и вставить собственную разметку. Представьте, что произойдет, если пользователь войдет, " onclick="alert('hello');
и вы вставите это вtitle="..."
Если вы используете PHP, вы можете использовать htmlspecialchars
функцию для этого. Другие языки могут иметь другие подобные функции.
Обновление: я исправлен в вопросе об апосе. Чертовски надоедливый ИП.
'
не используйте '
. Если по какой-либо причине вы используете одинарные кавычки для атрибута HTML, например, title='something'
вы должны явно избегать любых одинарных кавычек внутри этого значения атрибута.
Это зависит от вашего варианта использования, но мы, вероятно, не должны использовать его '
на естественном языке, поэтому проблема не должна возникать, если у вас нет компьютерного кода в XML.
Когда мы переводим строки, мы обнаруживаем, что некоторые переводчики заменяют заключительные кавычки на фигурные кавычки в юникоде, но оставляют прямые кавычки в качестве вводных, оставляя их визуально несбалансированными и выглядящими непрофессионально.
Символы Юникод ‘
и ’
должны заменить, '
где это возможно, столько, сколько “
и ”
должны заменить "
. Это полезно, потому что компьютеры не распознают фигурные знаки препинания как особые. (Хотя я удивлен, увидев, что Stack Overflow / Chrome считает « don’t
» орфографической ошибкой, тогда как «доволен don't
».)
Это не помогает, что у нас есть очень заманчивые '
и "
символы прямо на клавиатуре.
Итак, давайте посмотрим, кодирует ли StackExchange сам апостроф с помощью сущности HTML.
Вот несколько примеров из исходного кода этой страницы.
(1) Название вопроса: Закодировано.
Should I escape the Apostrophe ( ' ) character with its HTML entity (&#39;)?
(2) ответ Дрю: не закодировано.
But I don't believe it is, in general, necessary.
(3) Комментарий Тома к ответу nitro2k01: Закодировано.
I've got two contradicting answers now. One recommends escaping ' and the other does not. What should I believe?
Так что это идет в обе стороны.
Тем не менее, исходный код этой страницы никогда не использует '
. Все кодировки имеют форму '
. Это соответствует nitro2k01 и совету Дрю не использовать '
.
Ваш ответ зависит от контекста:
Если вы пишете абзац в HTML с этими данными, вам может быть достаточно экранировать <,> и &:
<p>{string}</p>
Если вы пишете в атрибут HTML, хотя, как
<a href='/some/path/{string}'>...</a>
Тогда вы должны полностью избежать апостроф. Это может быть вектор атаки, если злоумышленник вставил это для string
:
string = "' onmouseover='alert(\"nasty script here!\")' data-ignore='"
То же самое касается двойных кавычек. Я даже читал, что backtick `уязвим, поскольку его можно использовать и для атрибутов HTML. Если у вас нет скрипта автоматической проверки синтаксиса HTML как части ваших процедур развертывания, предположите, что любой из этих трех может быть использован и должен быть экранирован для атрибутов HTML.
В крайнем случае, даже не заключенные в кавычки атрибуты действительны, поэтому пробелу также необходимо экранировать. И !
, @
, $
, %
, (
, )
, =
, +
, {
, }
, [
, и ]
, все из которых могут выйти из атрибута и позволяет вставить новый.
Чтобы сделать побег в JavaScript, я использую JQuery $(element).text(string)
или $(element).attr(attrname, string)
для меня. Будьте очень осторожны с тем $(element).html(unsafe)
, что не ускользнет от вашего HTML!
Что касается серверного кода, я должен тщательно оценить риск для каждого случая и внимательно прочитать документацию. Это будет зависеть от конкретного языка и используемых вами библиотек, таких как Rails, Django, raw PHP, Drupal и т. Д.
Если вы планируете остановить проблему как можно раньше, прежде чем она попадет в вашу базу данных, держите лошадей. HTML-экранирование текста, хранящегося в вашей БД, может привести вас к адской поездке. Что если позже вы захотите разрешить определенные теги HTML, но не разрешать другие, такие как курсив, полужирный шрифт, цвета и таблицы? Что, если вы что-то пропустили во время первого прохода, но ваш побег уже сбежал &
как &
и "
как "
? Это превратит те в &amp;
и &quot;
?
Мой подход заключается в том, чтобы выполнять только экранирование SQL для базы данных, но оставить все специальные символы HTML для последующей обработки. Таким образом, я могу легко отлаживать и настраивать экранирование HTML. Имейте в виду, это также означает, что я не могу доверять своим собственным таблицам SQL, если они имеют предоставленные пользователем строки.
Никогда не доверяйте вводимым пользователем данным и всегда цитируйте свои атрибуты HTML!
Основано на: есть нечто большее, что может избежать HTML, чем &, <,> и " Райан Гроув
Если ваш апостроф принадлежит контенту, избегайте его. Любые другие символы содержимого, которые можно спутать с кодом, избегайте его.
Самый простой способ выполнить работу без фактической сущности - это использовать 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>";
&apos
, теперь она действительна для HTML5. Тем не менее, если вам нужно поддерживать устаревшие браузеры или писать электронные письма в формате HTML для Outlook, то вам лучше всего придерживаться этого,'
если вы считаете необходимым избежать экранирования персонажа.