почему мне нужно сделать html.encode () - PullRequest
5 голосов
/ 26 мая 2010

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

Является ли единственная причина, по которой кто-то может вставить javascript в текстовый редактор? есть ли другая причина?

Ответы [ 9 ]

16 голосов
/ 26 мая 2010

Безопасность является причиной.

Наиболее очевидной / распространенной причиной является Межсайтовый скриптинг (XSS). Оказывается, это является основной причиной проблем безопасности, которые вы можете наблюдать на своем сайте.

Межсайтовый скриптинг (XSS) является типом уязвимости компьютерной безопасности обычно встречается в веб-приложениях что позволяет злоумышленникам внедрить клиентский скрипт в веб страницы, просмотренные другими пользователями. использовать межсайтовый скриптинг уязвимость может быть использована злоумышленниками обойти средства управления доступом, такие как та же политика происхождения. Межсайтовый скрипты на сайтах были примерно 80% всей безопасности уязвимости, задокументированные Symantec по состоянию на 2007 год. 1 Их влияние может варьироваться от мелкой неприятности до значительной риск безопасности, в зависимости от чувствительность данных, обрабатываемых уязвимый сайт, и характер любого меры безопасности, реализованные владелец сайта.

Дополнительно, как показано в комментариях ниже, макет вашего сайта также может быть испорчен.

Требуется Библиотека сценариев Microsoft Anti-Cross Site

Дополнительные ресурсы

http://forums.asp.net/t/1223756.aspx

3 голосов
/ 26 мая 2010

Я думаю, что вы путаете "кодирование" с "очисткой".

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

a < b

кодируется в формате HTML как

a &lt; b

и отображается в браузере HTML (так же, как пользователь ввел его) как:

a < b

Если вы хотите принять HTML от пользователя (что звучит так, как вы это делаете в данном случае), он уже находится в формате HTML, поэтому вы не хотите снова вызывать HTML.Encode. Тем не менее, вы можете удалить его, чтобы удалить определенную разметку, которую вы не разрешаете (например, блоки скриптов).

3 голосов
/ 26 мая 2010

Вы делаете некоторые ошибки.

Если вы принимаете текст в формате HTML из редактора форматированного текста, вы не можете вызвать Html.Encode, или он закодирует все теги HTML, и вместо этого вы увидите необработанную разметку форматированного текста.

Однако вам все равно нужно защищаться от XSS.

Другими словами, если пользователь вводит следующий HTML-код:

<b>Hello!</b>
<script>alert('XSS!');</script>

Вы хотите сохранить тег <b>, но удалить (не кодировать) тег <script>.
Точно так же вам нужно удалить встроенные атрибуты событий (например, onmouseover) и URL-адреса Javascript (например, <a href="javascript:alert('XSS!');>Dancing Bunnies!</a>)

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

2 голосов
/ 26 мая 2010

Мало того, что пользователь может вводить код JavaScript или какую-либо другую неловкость, вам нужно использовать кодирование HTML для отображения определенных символов на странице. Вы не хотели бы, чтобы ваша страница ломалась, потому что ваша база данных содержала: «Nice Page: ->».

Кроме того, если вы вводите код в базу данных, обязательно "санируйте" входные данные в базу данных.

2 голосов
/ 26 мая 2010

Безопасность является основной причиной.

1 голос
/ 26 мая 2010

В сторону ..... В MVC2 реализованы новые функции, поэтому вам больше не нужно вызывать HTML.

если вы измените синтаксис вида с

до

MVC будет автоматически кодировать для вас. Это делает вещи намного проще / быстрее. Опять же, только MVC2

1 голос
/ 26 мая 2010

Да, это предотвращает выполнение JavaScript, если кто-то вводит вредоносную строку в редакторе форматированного текста. Тем не менее, простой текст javascript это не единственная ваша задача, например, это XSS:

<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041>

Посмотрите здесь различные варианты XSS; http://ha.ckers.org/xss.html

0 голосов
/ 27 мая 2010

Основная причина сделать то, что вы предлагаете, это избежать вашего вывода. Поскольку вы принимаете HTML и хотите его вывести, вы не сможете этого сделать. Что вам нужно сделать, это отфильтровать то, что пользователь может сделать, что небезопасно, или, по крайней мере, не то, что вы хотите.

Для этого позвольте мне предложить AntiSamy .

Вы можете продемонстрировать это здесь .

То, что вы делаете, связано с большим количеством наследственных рисков, и вы должны очень внимательно об этом подумать.

0 голосов
/ 26 мая 2010

Другая причина заключается в том, что некоторые пользователи могут ввести несколько закрывающих тегов </div></table> и потенциально нарушить макет вашего веб-сайта. Если вы используете инструмент редактирования HTML, убедитесь, что созданный html действителен, прежде чем встраивать его в страницу без кодирования. Для этого требуется некоторый синтаксический анализ на стороне сервера. Для этого вы можете использовать HtmlAgilityPack .

...