Безопасно ли отображать пользовательский ввод в качестве входных значений без очистки? - PullRequest
6 голосов
/ 16 марта 2010

Скажем, у нас есть форма, где пользователь вводит различную информацию. Мы проверяем информацию и обнаруживаем, что что-то не так. Поле отсутствует, недействительный адрес электронной почты и т. Д.

При повторном отображении формы пользователю я, конечно, не хочу, чтобы ему приходилось вводить все заново, поэтому я хочу заполнить поля ввода. Безопасно ли это делать без санитарии? Если нет, то какова минимальная санитарная обработка, которая должна быть сделана первой?

И для уточнения: он, конечно, будет очищен перед тем, как, например, добавлен в базу данных или отображен в другом месте на сайте.

Ответы [ 4 ]

8 голосов
/ 16 марта 2010

Нет, это не так. Пользователь может быть перенаправлен на форму со стороннего сайта или просто ввести данные (невинно), которые нарушат HTML.

Преобразование любого символа со специальным значением в его HTML-сущность.

т.е. & до &amp;, < до &lt;, > до &gt; и " до &quot; (при условии, что вы разделяете значения атрибута, используя ", а не '.

В Perl используйте HTML :: Entities , в TT используйте html фильтр , в PHP используйте htmlspecialchars . В противном случае ищите что-то похожее на языке, который вы используете.

1 голос
/ 16 марта 2010

Вы не можете вставить предоставленные пользователем данные в HTML-документ без предварительного кодирования.Ваша цель состоит в том, чтобы гарантировать, что структура документа не может быть изменена и что данные всегда обрабатываются как значения данных, а не как разметка HTML или код Javascript.Атаки на этот механизм обычно известны как «межсайтовый скриптинг» или просто «XSS».

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

Если вы пишете HTML так, чтобы значение атрибута тега появлялось в паре символов двойной или одинарной кавычки, то вам нужно только убедиться, что вы html-кодируют символ кавычки, который вы выбрали для использования.Если вы не правильно цитируете свои атрибуты, как описано выше, то вам нужно беспокоиться о многих других символах, включая пробелы, символы, знаки препинания и другие символы управления ascii. Хотя, если честно, возможно, в любом случае, возможно, безопаснее всего кодировать эти не алфавитно-цифровые символы .

Помните, что значение атрибута HTML может появляться в 3 различных синтаксических контекстах:

Значение атрибута в двойных кавычках

<input type="text" value="**insert-here**" />

Вам необходимо только закодировать символ двойной кавычки в подходящее безопасное HTML-значение, например &quot;

Значение атрибута в одинарных кавычках

<input type='text' value='**insert-here**' />

Вам нужно только закодировать символ одинарных кавычек в подходящее безопасное HTML-значение, такое как &#145;

Значение атрибута без кавычек

<input type='text' value=**insert-here** />

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

За исключением буквенно-цифровых символов, экранируйте все символы со значениями ASCII менее 256 с помощьюформат &#xHH; (или именованный объект, если доступен) для предотвращения переключения атрибута.Атрибуты без кавычек могут быть разбиты множеством символов, включая [space] % * + , - / ; < = > ^ и | (и больше). [пункт поднят из OWASP]

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

Для получения дополнительной информации

см. Шпаргалку XSS по профилактике на OWASP .
1 голос
/ 16 марта 2010

Это небезопасно, потому что, если кто-то может заставить пользователя отправить определенные данные в вашу форму, вы выведете их, и они будут «выполнены» браузером. Например, если пользователь вынужден отправить '/><meta http-equiv="refresh" content="0;http://verybadsite.org" />, в результате произойдет нежелательное перенаправление.

0 голосов
/ 16 марта 2010

Да, это безопасно, если, конечно, вы правильно кодируете значение.

Значение, которое помещается внутри атрибута в HTML, должно быть закодировано в HTML.Платформа на стороне сервера, которую вы используете, должна иметь методы для этого.Например, в ASP.NET есть метод Server.HtmlEncode, а элемент управления TextBox автоматически HTML-кодирует значение, которое вы указали в свойстве Text.

...