Подтвердить что ты не робот

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

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

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

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

1)

"Привет, у меня есть <script> предупреждение ("! Плохо ") </script> проблема с < собакой > элемент..."

2)

"Привет, это & ​​lt; b стиль =" ширина: выражение (предупреждение ( 'плохо!')) " > собака </б > черный".

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

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

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

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

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

Изменить 2:

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

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

4b9b3361

Ответ 1

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

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

ИЗМЕНИТЬ

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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 , "" );
}