Как предотвратить атаки с использованием Javascript в пользовательском HTML - PullRequest
51 голосов
/ 03 июня 2009

Я сохраняю пользовательский HTML (в базе данных). Я должен предотвратить атаки инъекций Javascript. Самым пагубным из всех, что я видел, является сценарий в стиле = "expression (...)".

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

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

1)

"Здравствуйте, у меня есть предупреждение ( "плохой!") проблема с элемент ... "

2)

"Привет, это собака черный. "

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

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

Edit: Извините, забыл упомянуть окружение - по сути это стек MS:

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

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

Редактировать 2:

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

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

Ответы [ 7 ]

36 голосов
/ 03 июня 2009

Ты думаешь это все? Проверьте это .

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

EDIT

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

7 голосов
/ 03 июня 2009

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

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

4 голосов
/ 03 июня 2009

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

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

2 голосов
/ 13 сентября 2017

В настоящее время лучше всего использовать заголовок Content Security Policy , например:

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

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

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

2 голосов
/ 03 июня 2009

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

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

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

0 голосов
/ 28 января 2015

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

function restrict(elem){
  var tf = _(elem);
  var rx = new RegExp;
  if(elem == "email"){
       rx = /[ '"]/gi;
  }else if(elem == "search" || elem == "comment"){
    rx = /[^a-z 0-9.,?]/gi;
  }else{
      rx =  /[^a-z0-9]/gi;
  }
  tf.value = tf.value.replace(rx , "" );
}
0 голосов
/ 03 июня 2009

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

...