Как я препятствую тому, чтобы люди делали XSS в Spring MVC?

Что я должен сделать для предотвращения XSS в Spring MVC? Прямо сейчас я просто помещаю все места, где я произвел пользовательский текст в JSTL <c:out> теги или fn:escapeXml() функции, но это кажется подверженным ошибкам, поскольку я мог бы пропустить место.

Существует ли легкий систематический способ предотвратить это? Возможно, как фильтр или что-то? Я собираюсь введенный путем определения @RequestParam параметры на моих методах контроллера.

53
задан BalusC 16 May 2016 в 21:23
поделиться

5 ответов

весной, вы можете избежать HTML из страниц JSP, создаваемых

Теги. Это закрывает много проспектов для атак XSS и может быть сделано автоматически тремя способами:

для всего приложения в файле Web.xml :

<context-param>
    <param-name>defaultHtmlEscape</param-name>
    <param-value>true</param-value>
</context-param>

для всех форм на данной странице в Сам файл:

<spring:htmlEscape defaultHtmlEscape="true" /> 

для каждой формы:

<form:input path="someFormField" htmlEscape="true" /> 
53
ответ дан 7 November 2019 в 08:48
поделиться

Как вы собираете ввод пользователя в первую очередь? Этот вопрос / ответ может помочь, если вы используете FormController :

Весна: ensaping вход при привязке к команде

0
ответ дан 7 November 2019 в 08:48
поделиться

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

Обзор: http://www.gablog.eu/online/node/91

0
ответ дан 7 November 2019 в 08:48
поделиться

Попробуйте XSSFilter .

8
ответ дан 7 November 2019 в 08:48
поделиться

Можете ли вы использовать document.write () для добавления сценария jQuery на страницу? Это должно привести к синхронной загрузке jQuery. Попробуйте это:

<script type="text/javascript" charset="utf-8">
// <![CDATA
 if (typeof jQuery === 'undefined') {
  document.write('<script src="{{ URL }}/jquery.js"><' + '/script>');
 }
// ]]>
</script>
<script type="text/javascript" src="{{ URL }}/widget.js"></script>

Если вы хотите выполнить проверку jQuery внутри вашего скрипта виджета, то я полагаю, что следующие работает кросс-браузер:

(function() {
 function your_call($) {
  // your widget code goes here
 }
 if (typeof jQuery !== 'undefined') your_call(jQuery);
 else {
  var head = document.getElementsByTagName('head')[0];
  var script = document.createElement('script');
  script.type = 'text/javascript';
  script.src = '{{ URL }}/jquery.js';
  var onload = function() {
   if (!script.readyState || script.readyState === "complete") your_call(jQuery);
  }
  if ("onreadystatechange" in script) script.onreadystatechange = onload;
  else script.onload = onload;
  head.appendChild(script);
 }
})()
-121--945121-

при попытке аларм ('I\' m test'); есть проблема

Обратная косая черта также побег в Ruby strings Итак, строковый литерал:

"alert('I\'m testing');"

означает последовательность:

alert('I'm testing');

обратная косая черта уже исчезла, прежде чем JavaScript взглянет на нее. При написании строкового литерала JavaScript внутри строкового литерала Ruby необходимо избежать побега, \\, чтобы получить реальный \, который затем в JavaScript избежит апострофа.

escape _ javascript правильно генерирует обратную косую черту для JavaScript, если обратная косая черта была включена в его входные данные. Но опять же, если вы пишете строковый литерал, вы должны уйти от обратной косой черты, чтобы получить реальную обратную косую черту:

escape_javascript("\b")     -> this is a backspace character!
escape_javascript("\\b")    -> this is backslash-then-letter-b;
                               escaped for JavaScript literal to double-backslash-then-b.

Итак, это нормально:

"'"+escape_javascript(myvar)+"'"

или вы можете использовать кодер JSON, чтобы создать строковый литерал JavaScript, включая окружающие кавычки.

-121--2604498-

При попытке предотвратить XSS важно продумать контекст. Пример того, как и чего следует избежать, очень отличается, если вы выводите данные внутри переменной в фрагменте javascript, а не выводите данные в HTML- тэге или атрибуте HTML.

У меня есть пример этого здесь: http://erlend.oftedal.no/blog/?blogid=91

Также проверьте OWASP XSS Prevention Cheat Sheet: http://www.owasp.org/index.php/XSS_%28Cross_Site_Scripting%29_Prevention_Cheat_Sheet

Итак, короткий ответ, убедитесь, что вы избегаете выходных данных, как предложено Tendayi Mawushe, но обратите особое внимание, когда вы выводите данные в HTML атрибуты или javascript.

6
ответ дан 7 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: