Как предотвратить атаки Javascript в пользовательский HTML-код

Я сохраняю отправленный пользователем HTML (в базе данных). Я должен предотвратить атаки с помощью Javascript. Наиболее пагубным я видел сценарий в стиле = “выражение (…)”.

В дополнение к этому, справедливое количество допустимого пользовательского контента будет включать специальные символы и XML-конструкции, поэтому я бы хотел, если это возможно, избегать применения белого списка. (Список всех допустимых элементов HTML и атрибута).

Примеры строк атаки Javascript:

1)

«Привет, у меня есть проблема с alert (« bad! ») с элементом …”

2)

«Привет, это выражение Dog является черным.”

Есть ли способ предотвратить такой Javascript и оставить остальное неповрежденным?

Единственное решение, которое я имею до сих пор, – использовать регулярное выражение для удаления определенных шаблонов. Он решает случай 1, но не случай 2.

Редактировать: Извините, забыл упомянуть об окружающей среде – это, по сути, стек MS:

  • SQL Server 2005
  • C # 3.5 (ASP.NET)
  • Javascript (очевидно) и jQuery.

Я хотел бы, чтобы chokepoint был уровнем ASP.NET – каждый может обработать плохой HTTP-запрос.

Изменить 2:

Спасибо за ссылки всем. Предполагая, что я могу определить свой список (он будет содержать множество математических и программирующих конструкций, поэтому белый список будет очень раздражать). У меня все еще есть вопрос:

Какой парсер позволит мне просто удалить «плохие» части? Плохая часть может быть целым элементом, но тогда, что об этих сценариях, которые находятся в атрибутах. Я не могу удалить волей-неволей.

Вы думаете, что так? Проверьте это .

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

EDIT :

К сожалению, я не знаком с .NET, но вы можете проверить собственную битву с использованием XSS ( http://blog.stackoverflow.com/2008/06/safe-html-and-xss/ ) и код, который был написанный для анализа HTML, размещенного на этом сайте: ссылка на Archive.org – очевидно, вам может понадобиться изменить это, потому что ваш белый список больше, но вам стоит начать.

Белый список элементов и атрибутов – единственный приемлемый выбор, на мой взгляд. Все, что не указано в вашем белом списке, должно быть удалено или закодировано (изменить <> & “на сущности). Также обязательно проверяйте значения в пределах разрешенных атрибутов.

Все меньше, и вы открываете себе проблемы – известные подвиги или те, которые будут обнаружены в будущем.

Единственный действительно безопасный способ – использовать белый список. Кодируйте все, а затем конвертируйте разрешенные коды обратно.

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

В принципе, как сказал Паоло, вы должны попытаться сосредоточиться на том, что пользователям разрешено делать, а не пытаться отфильтровать материал, который они не должны делать.

Храните список разрешенных тегов HTML (например, b, i, u …) и отфильтровывайте все остальное. Вероятно, вы также захотите удалить все атрибуты в разрешенные tags HTML (например, из-за вашего второго примера).

Другим решением было бы ввести так называемый BB-код, который используется многими форумами. Он похож на синтаксис HTML, но начинается с идеи белого списка разрешенного кода, который затем преобразуется в HTML. Например, пример [b] [/ b] приведет к примеру . Убедитесь, что при использовании кода BB для фильтрации HTML-тегов заранее.

В настоящее время лучшим вариантом является использование заголовка политики безопасности контента следующим образом:

 Content-Security-Policy: default-src 'self'; 

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

Однако он не будет работать на старых браузерах.

какой серверный код вы используете? В зависимости от того, какие числа или способы вы можете отфильтровать вредоносный скрипт, но это опасная территория. Даже опытные профессионалы попадаются: http://www.codinghorror.com/blog/archives/001167.html

Вы можете использовать эту функцию ограничения.

 function restrict(elem){ var tf = _(elem); var rx = new RegExp; if(elem == "email"){ rx = /[ '"]/gi; }else if(elem == "search" || elem == "comment"){ rx = /[^az 0-9.,?]/gi; }else{ rx = /[^a-z0-9]/gi; } tf.value = tf.value.replace(rx , "" ); }