отфильтровать закодированное содержимое javascript из запроса

У меня проблема, когда я пытаюсь очистить содержимое запроса, чтобы удалить HTML и javascript, если они включены во входные параметры.

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

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

Это работает до тех пор, пока вредоносный javascript находится внутри некоторых тегов HTML, но не работает для URL-адреса с кодом javascript без окружающего его HTML, например:

http://example.com/index.html?a=40&b=10&c='-prompt``-' 

заканчивается отображением предупреждения на странице. Вот чем я сейчас занимаюсь:

param = encoder.canonicalize(param, false, false);
param = Jsoup.clean(param, Whitelist.none());

Итак, вопрос:

  • Есть ли способ, с помощью которого я могу убедиться, что мой ввод лишен всего кода HTML и javascript в фильтре?
  • Должен ли я добавить некоторые проверки регулярных выражений, но есть ли какое-либо регулярное выражение, которое позаботится о случаях, которые проходят проверку, которая у меня есть прямо сейчас?

person Ash    schedule 29.03.2016    source источник


Ответы (1)


ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ:

Если выходное экранирование не разрешено в вашем решении, ориентированном на Интернет, вы находитесь в ПРОБЛЕМНОМ СЦЕНАРИИ. Это как антивирус в Windows: вы сможете обнаруживать конкретные и известные атаки, но не сможете обнаружить или защититься от неизвестных атаки. Если ваш работодатель настаивает на этом пути, вы должны должным образом уведомить руководство об этом факте и получить от него согласие на риски в письменной форме. Каждый раз, когда я спорил с руководством при этом они выбрали правильное решение - экранирование вывода.

================================================================

Прежде всего... будьте осторожны при использовании JSoup в любой ситуации очистки/фильтрации/проверки ввода.

При получении недопустимого HTML, например

<script>alert(1);

Jsoup добавит недостающий тег </script>.

Это означает, что если вы используете Jsoup для «очистки» HTML, он сначала преобразует НЕДЕЙСТВИТЕЛЬНЫЙ HTML в ДЕЙСТВИТЕЛЬНЫЙ HTML, прежде чем он начнет обработку.

Итак, вопрос: есть ли способ, с помощью которого я могу убедиться, что мой ввод лишен всего кода HTML и javascript в фильтре? Должен ли я добавить некоторые проверки регулярных выражений, но есть ли какое-либо регулярное выражение, которое позаботится о случаях, которые проходят проверку, которая у меня есть прямо сейчас?

Нет. ESAPI и проверка ввода ESAPI не подходят для вашего варианта использования, поскольку HTML не является обычным языком, а ввод ESAPI для его проверки являются регулярными выражениями. Дело в том, что вы не можете делать то, о чем просите:

Есть ли способ, с помощью которого я могу убедиться, что мой ввод лишен всего кода HTML и javascript в фильтре?

И по-прежнему иметь функционирующее веб-приложение, для которого требуется определяемый пользователем HTML/JavaScript.

Вы можете немного сложить колоду в свою пользу: я бы выбрал что-то вроде HTML-санитайзер OWASP. и протестируйте свою реализацию на входных данных XSS, перечисленных здесь.

Многие из этих входных данных взяты из шпаргалки OWASP по уклонению от XSS-фильтра и, по крайней мере, будут проверять ваше приложение против известных попыток. Но вы никогда не будете в безопасности без экранирования вывода.

===================ОБНОВЛЕНИЕ ИЗ КОММЕНТАРИЙ==================

Таким образом, вариант использования — попытаться заблокировать все html и javascript. Я рекомендую реализовать caja, так как он инкапсулирует HTML, CSS и Javascript.

Javascript, однако, также трудно управлять проверкой ввода, потому что, как и HTML, JavaScript не является обычным языком. Кроме того, у каждого браузера есть собственная реализация, которая по-разному отличается от спецификации ECMAScript. Если вы хотите защитить свой ввод от интерпретации, это означает, что в идеале вам нужно иметь синтаксический анализатор для каждого семейства браузеров, пытающихся интерпретировать пользовательский ввод, чтобы заблокировать его.

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

person avgvstvs    schedule 29.03.2016
comment
Спасибо за ответ. Я понимаю вашу точку зрения. Об этом И все еще иметь функционирующее веб-приложение, которое требует определяемого пользователем HTML/JavaScript. Что, если я не хочу разрешать пользователям передавать любой HTML/JS в качестве входных параметров запроса. Есть ли способ предотвратить это? Я пройду через HTML-дезинфицирующее средство, на которое вы ссылались. - person Ash; 29.03.2016
comment
Начните здесь: github.com/OWASP/java-html -sanitizer/blob/master/docs/ По сути, это звучит так, как будто вы хотите определить построитель политик, который по существу пуст... он не позволит ЛЮБЫМ тегам HTML в приложении. Тем не менее, простое запрещение ВСЕХ html не остановит XSS, который атакует HTML-атрибуты... если IE вам нужно защититься от vbscript И javascript. - person avgvstvs; 29.03.2016
comment
Я не знаю, позволит ли HTML Sanitizer определять политики атрибутов, если вы уже отклоняете все входные данные HTML. - person avgvstvs; 29.03.2016
comment
Я пытаюсь отклонить все входные данные HTML и JS и добился определенного успеха, используя некоторые дезинфицирующие средства HTML. Проблема заключается в том, что эти дезинфицирующие средства полагаются на ввод в формате HTML, чтобы иметь возможность его удалить. Но проблема в том, что некоторые входные данные могут быть закодированы (для чего я использую ESAPI.caninicalize, чтобы декодировать их обратно в простейшую форму). Но если на входе нет HTML и есть какой-то вредоносный JS, как в параметре «c» URL-адреса в моем вопросе выше, то моя логика кода не может их удалить, потому что JS не находится ни в одном HTML-теге, таком как ‹ скрипт› тег. Что было бы хорошим способом убрать такой ввод? - person Ash; 29.03.2016
comment
Можно посмотреть на caja вместо HTML Sanitizer. (Дезинфицирующее средство предназначено специально для HTML.) github.com/google/caja Caja также предназначен для обработки CSS и пользовательский javascript. - person avgvstvs; 31.03.2016