Вы должны иметь в виду, что для предотвращения 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?