Что я должен сделать для предотвращения XSS в Spring MVC? Прямо сейчас я просто помещаю все места, где я произвел пользовательский текст в JSTL <c:out>
теги или fn:escapeXml()
функции, но это кажется подверженным ошибкам, поскольку я мог бы пропустить место.
Существует ли легкий систематический способ предотвратить это? Возможно, как фильтр или что-то? Я собираюсь введенный путем определения @RequestParam
параметры на моих методах контроллера.
весной, вы можете избежать 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" />
Как вы собираете ввод пользователя в первую очередь? Этот вопрос / ответ может помочь, если вы используете FormController
:
Всегда проверяйте вручную методы, теги, которые вы используете, и убедитесь, что они всегда убегают (один раз) в конце. Рамки имеют много ошибок и различий в этом аспекте
Можете ли вы использовать 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.