Чи слід уникати символу Apostrophe (') з його сутністю 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, тоді вам найкраще дотримуватися, 'якщо вважаєте за необхідне уникнути символу.
tomhughes

24

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

<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функцію для цього. Інші мови можуть мати інші подібні функції.

Оновлення: я виправлений у питанні про apos. Проклятий набридлий IE.


Зараз у мене є дві суперечливі відповіді. Один рекомендує втекти ', а інший ні. У що я повинен вірити?
Том

7
Коротко. Ви можете чи не можете уникнути цього на свій розсуд. Якщо ви це зробите, &#39;не використовуйте &apos;. Якщо з будь-якої причини ви використовуєте одиничні лапки для атрибута HTML, начебто title='something'ви, очевидно, повинні уникати будь-яких цитат усередині цього атрибута.
nitro2k01

ваш другий абзац - це те, що для мене важливо, мій OCD почав перевитрати, коли я побачив червоний ряд тексту в моєму git- комітеті
eballeste

6

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

Там, де у нас перекладені рядки, ми виявляємо, що деякі перекладачі замінюють кінцеві цитати фігурними цитатами unicode, але залишають прямі цитати як початкові цитати, залишаючи їх візуально неврівноваженими та виглядаючи непрофесійними.

Символи unicode і повинні замінювати, 'де це можливо, стільки, скільки і повинні замінити ". Це корисно, оскільки комп'ютери не визнають фігурні пунктуації як особливі. (Хоча мені цікаво бачити, що переповнення стека / Chrome вважає " don’t" помилкою написання, тоді як це задоволено " don't".)

Це не допомагає, що у нас дуже привабливі 'та "символи прямо на клавіатурі.


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;.


1
Хоча у всіх 3 випадках це не потрібно кодувати 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’s $(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-файлів не вдається, ніж &, <,> та " від Ryan Grove


-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>";

4
Це жарт?
Су ’17

@Su 'Я боюся, що це не так ...
William Edwards
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.