div contenteditable, XSS - PullRequest
       4

div contenteditable, XSS

8 голосов
/ 11 ноября 2011

У меня в данный момент есть простой <div contenteditable="true"> рабочий, но вот моя проблема.

В настоящее время пользователь может создать постоянный XSS, вставив <script> в div, что я определенно не хочу.

Тем не менее, мои текущие идеи исправить это:

  • Разрешить только теги a и img
  • Использовать текстовую область (не очень хорошая идея, потому что тогда есть пользователископируйте и вставьте изображения)

Что вы, ребята, предлагаете?

Ответы [ 2 ]

8 голосов
/ 11 ноября 2011

Вы должны иметь в виду, что для предотвращения xss вы ДОЛЖНЫ ДЕЛАТЬ ЭТО НА СТОРОНЕ СЕРВЕРА.Если в вашем текстовом редакторе (например, YUI или tinyMCE) есть какой-то javascript для предотвращения ввода тега скрипта, это не мешает мне проверять ваши запросы http post, просматривать имена переменных, которые вы используете, и затем использовать firefox.Poster для отправки любой понравившейся строки на ваш сервер, чтобы обойти все проверки на стороне клиентаЕсли вы не проверяете пользовательский ввод SERVER SIDE, тогда вы делаете почти ничего продуктивного для защиты от XSS.

Любая защита xss на стороне клиента будет связана с тем, как вы отображаете пользовательский ввод;не так, как вы получаете это.Так, например, если вы закодировали все входные данные, чтобы они не отображались как html.Это выходит за рамки того, чего вы хотите достичь (только привязки и теги img).Просто имейте в виду, что чем больше вы позволяете визуализироваться, тем больше возможных уязвимостей вы выставляете.

При этом основная часть вашей защиты должна исходить от серверной части, и существует множество фильтров XSS в зависимости отто, что вы пишете (например, asp.net или tomcat / derby / jboss), на которое вы можете посмотреть.

Я думаю, что вы на правильном пути, допустив ТОЛЬКО теги a и img.Одна вещь, которую вы должны иметь в виду, это то, что вы можете помещать команды javascript в атрибуты src тегов, поэтому позаботьтесь о проверке атрибутов href.Но основная идея «ничего не разрешать, а затем изменять фильтры, чтобы разрешить только определенные вещи» (фильтрация белого списка AKA) лучше, чем «разрешить все, а затем отфильтровать то, что я не хочу» (фильтрация черного списка AKA).

В комментариях ниже, Брайан Никель также сказал это, что иллюстрирует мысль:

Все, кроме элементов и атрибутов, которые вы хотите сохранить.Я знаю, что вы упомянули об этом в своем ответе, но это стоит повторить, потому что это так страшно.<img onerror="stealMoney()">

Еще одна вещь, которую вы хотите сделать, это определить объект XSSFilterRequest (или что-то в этом духе) и в фильтре переопределить ваши запросы, чтобы любой вызов любогоОбъекты "getUrlParameter" и "getRequestParameter" запускают значения запроса через ваш фильтр xss.Это обеспечивает чистый способ фильтрации всего без переписывания существующего кода.

РЕДАКТИРОВАТЬ: пример xss фильтрации Python:

Python HTML дезинфицирующее средство / скруббер / фильтр

Библиотека Python для фильтрации XSS?

0 голосов
/ 11 ноября 2011

Как насчет использования google caja (переводчик от источника к источнику для защиты веб-контента на основе Javascript)?

Если у вас нет проверки xss на стороне сервера, вы можете применить html_sanitize как к данным, отправленным от пользователя, так и к данным, полученным с сервера, который должен отображаться. В худшем случае вы получите содержимое XSSed в базе данных, которое никогда не будет отображаться пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...