Вы не можете вставить предоставленные пользователем данные в HTML-документ без предварительного кодирования.Ваша цель состоит в том, чтобы гарантировать, что структура документа не может быть изменена и что данные всегда обрабатываются как значения данных, а не как разметка HTML или код Javascript.Атаки на этот механизм обычно известны как «межсайтовый скриптинг» или просто «XSS».
Если вставить в значение атрибута HTML, то вы должны убедиться, что строка не может привести к преждевременному завершению значения атрибута,Вы также должны, конечно, убедиться, что сам тег не может быть завершен.Вы можете добиться этого с помощью HTML-кодирования любых символов, которые не гарантированно безопасны.
Если вы пишете HTML так, чтобы значение атрибута тега появлялось в паре символов двойной или одинарной кавычки, то вам нужно только убедиться, что вы html-кодируют символ кавычки, который вы выбрали для использования.Если вы не правильно цитируете свои атрибуты, как описано выше, то вам нужно беспокоиться о многих других символах, включая пробелы, символы, знаки препинания и другие символы управления ascii. Хотя, если честно, возможно, в любом случае, возможно, безопаснее всего кодировать эти не алфавитно-цифровые символы .
Помните, что значение атрибута HTML может появляться в 3 различных синтаксических контекстах:
Значение атрибута в двойных кавычках
<input type="text" value="**insert-here**" />
Вам необходимо только закодировать символ двойной кавычки в подходящее безопасное HTML-значение, например "
Значение атрибута в одинарных кавычках
<input type='text' value='**insert-here**' />
Вам нужно только закодировать символ одинарных кавычек в подходящее безопасное HTML-значение, такое как ‘
Значение атрибута без кавычек
<input type='text' value=**insert-here** />
Вы никогда не должны иметь значение атрибута html-тега без кавычек, но иногда это не под вашим контролем.В этом случае нам действительно нужно беспокоиться о пробелах, пунктуации и других управляющих символах, поскольку они вырвут нас из значения атрибута.
За исключением буквенно-цифровых символов, экранируйте все символы со значениями ASCII менее 256 с помощьюформат &#xHH;
(или именованный объект, если доступен) для предотвращения переключения атрибута.Атрибуты без кавычек могут быть разбиты множеством символов, включая [space]
%
*
+
,
-
/
;
<
=
>
^
и |
(и больше). [пункт поднят из OWASP]
Пожалуйста, помните, что вышеприведенные правила применяются только к управляющему внедрению при вставке в значение атрибута HTML.В других областях страницы применяются другие правила.
Для получения дополнительной информации
см. Шпаргалку
XSS по профилактике на OWASP .