Відповіді:
У мене немає привілеїв для коментарів, або я б залишив це як коментар до попередньої відповіді.
НЕ, повторюю, НЕ уникайте апострофа в 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, а також правильну декларацію діаграми, наприклад:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
Однак вам слід звикнути уникати символів, які мають особливе значення у (X) HTML, а саме:
< <
> >
" "
& &
' '
Це дозволить вам не випадково написати розмітку, коли хочете записати ці символи. Це особливо важливо для введення користувачами для підтримки безпеки. Це менш очевидно, але насправді важливо врятуватися "
. Якщо рядок коли-небудь закінчується в атрибуті HTML ( title="something"
тощо), користувач може закінчити атрибут і вставити власну розмітку. Уявіть, що станеться, якщо користувач введе " onclick="alert('hello');
і ви вставите цеtitle="..."
Якщо ви використовуєте PHP, ви можете використовувати htmlspecialchars
функцію для цього. Інші мови можуть мати інші подібні функції.
Оновлення: я виправлений у питанні про apos. Проклятий набридлий IE.
'
не використовуйте '
. Якщо з будь-якої причини ви використовуєте одиничні лапки для атрибута HTML, начебто title='something'
ви, очевидно, повинні уникати будь-яких цитат усередині цього атрибута.
Це залежить від вашого випадку використання, але нас, мабуть, не варто використовувати '
на природній мові взагалі, тому проблема не повинна виникати, якщо у вашому XML немає коду комп'ютера.
Там, де у нас перекладені рядки, ми виявляємо, що деякі перекладачі замінюють кінцеві цитати фігурними цитатами unicode, але залишають прямі цитати як початкові цитати, залишаючи їх візуально неврівноваженими та виглядаючи непрофесійними.
Символи unicode ‘
і ’
повинні замінювати, '
де це можливо, стільки, скільки “
і ”
повинні замінити "
. Це корисно, оскільки комп'ютери не визнають фігурні пунктуації як особливі. (Хоча мені цікаво бачити, що переповнення стека / 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’s $(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-файлів не вдається, ніж &, <,> та " від Ryan Grove
Якщо ваш апостроф належить до змісту, уникайте його. Будь-які інші символи вмісту, які можна плутати з кодом, уникають цього.
Найпростіший спосіб виконати роботу без використання фактичної сутності - це використання 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, тоді вам найкраще дотримуватися,'
якщо вважаєте за необхідне уникнути символу.