Вопрос-ответ

XSS prevention in JSP/Servlet web application

Предотвращение XSS в веб-приложении JSP / Servlet

Как я могу предотвратить XSS-атаки в веб-приложении JSP / Servlet?

Переведено автоматически
Ответ 1

XSS может быть предотвращен в JSP с помощью тега JSTL <c:out> или fn:escapeXml() функции EL при (повторном) отображении управляемого пользователем ввода. Сюда входят параметры запроса, заголовки, файлы cookie, URL, тело и т.д. Все, что вы извлекаете из объекта запроса. Также при повторном воспроизведении необходимо экранировать управляемые пользователем входные данные из предыдущих запросов, которые хранятся в базе данных.

Например:

<p><c:out value="${bean.userControlledValue}"></p>
<p><input name="foo" value="${fn:escapeXml(param.foo)}"></p>

Это экранирует символы, которые могут искажать отображаемый HTML, такие как <, >, ", ' & и , в объекты HTML / XML&lt;, такие как &gt;, &quot;, &apos;, &amp; и,,,.

Обратите внимание, что вам не нужно экранировать их в коде Java (сервлета), поскольку там они безвредны. Некоторые могут предпочесть экранировать их во время обработки запроса (как вы делаете в Servlet или Filter) вместо обработки ответа (как вы делаете в JSP), но таким образом вы рискуете, что данные излишне будут экранироваться дважды (например, & становится &amp;amp; вместо &amp; и в конечном итоге конечный пользователь увидит, что они представлены &amp;), или что данные, хранящиеся в БД, станут непереносимыми (например, при экспорте данных в JSON, CSV, XLS, PDF и т. Д., Что Не требует экранирования HTML при все). Вы также потеряете социальный контроль, потому что больше не будете знать, что на самом деле ввел пользователь. Вам, как администратору сайта, действительно хотелось бы знать, какие пользователи / IP-адреса пытаются выполнить XSS, чтобы вы могли легко отслеживать их и предпринимать соответствующие действия. Экранирование во время обработки запроса должно использоваться только в качестве последнего средства, когда вам действительно нужно исправить крушение плохо разработанного устаревшего веб-приложения в кратчайшие возможные сроки. Тем не менее, в конечном итоге вам следует переписать свои JSP-файлы, чтобы они стали XSS-безопасными.

Если вы хотите повторно отобразить управляемый пользователем ввод в виде HTML, в котором вы хотели бы разрешить только определенное подмножество HTML-тегов, таких как <b>, <i>, <u> и т.д., То вам необходимо очистить ввод с помощью белого списка. Для этого вы можете использовать анализатор HTML, такой как Jsoup. Но гораздо лучше внедрить удобный для пользователя язык разметки, такой как Markdown (также используется здесь в Stack Overflow). Затем вы можете использовать для этого анализатор Markdown, такой как CommonMark. Он также имеет встроенные возможности очистки HTML. Смотрите также Markdown или HTML.

Пожалуйста, обратите внимание, что термин "очистка", такой как Jsoup / Markdown / Owasp, относится к совершенно иному, чем термин "экранирование", такой как <c:out>. Средства очистки HTML в основном очищают строку, содержащую, возможно, вредоносный HTML, чтобы ее можно было использовать как безопасный HTML, без необходимости экранирования. Т. е. Когда вы на самом деле намереваетесь интерпретировать управляемый пользователем ввод буквально как HTML, включая такие теги, как <div>, <p>, <img> и т.д. Экранирующие средства HTML в основном вообще не позволяют их интерпретировать, так что они отображаются в виде обычного текста. Другими словами, вам совсем не нужно заранее очищать любой HTML, который вы, тем не менее, уже собираетесь экранировать.

Единственная проблема на стороне сервера в отношении баз данных - это предотвращение SQL-инъекций. Вам нужно убедиться, что вы никогда не объединяете строки пользовательского ввода непосредственно в запросе SQL или JPQL и что вы полностью используете параметризованные запросы. В терминах JDBC это означает, что вы должны использовать PreparedStatement вместо Statement. В терминах JPA используйте Query.


Альтернативой может быть переход с JSP / Servlet на MVC-фреймворк Java EE JSF. Он имеет встроенную защиту XSS (и CSRF!) Повсюду, так что вам не нужно вручную возиться с <c:out> и друзьями. Смотрите также Предотвращение атак CSRF, XSS и SQL-инъекций в JSF.

Ответ 2

Вопрос о том, как предотвратить xss, задавался несколько раз. В StackOverflow вы найдете много информации. Кроме того, на веб-сайте OWASP есть шпаргалка по предотвращению XSS, с которой вам следует ознакомиться.

Что касается используемых библиотек, библиотека ESAPI от OWASP имеет версию java. Вам стоит попробовать это. Кроме того, каждый фреймворк, который вы используете, имеет некоторую защиту от XSS. Опять же, на веб-сайте OWASP есть информация о большинстве популярных фреймворков, поэтому я бы рекомендовал зайти на их сайт.

Ответ 3

Мне очень повезло с OWASP Anti-Samy и советником AspectJ на всех моих контроллерах Spring, который блокирует доступ XSS.

public class UserInputSanitizer {

private static Policy policy;
private static AntiSamy antiSamy;

private static AntiSamy getAntiSamy() throws PolicyException {
if (antiSamy == null) {
policy = getPolicy("evocatus-default");
antiSamy = new AntiSamy();
}
return antiSamy;

}

public static String sanitize(String input) {
CleanResults cr;
try {
cr = getAntiSamy().scan(input, policy);
} catch (Exception e) {
throw new RuntimeException(e);
}
return cr.getCleanHTML();
}

private static Policy getPolicy(String name) throws PolicyException {
Policy policy =
Policy.getInstance(Policy.class.getResourceAsStream("/META-INF/antisamy/" + name + ".xml"));
return policy;
}

}

Вы можете получить советник AspectJ из этого поста stackoverflow

Я думаю, что это лучший подход, чем c: out, особенно если вы используете много javascript.

Ответ 4

Для управления XSS требуется несколько проверок данных со стороны клиента.


  1. Проверки входных данных (проверка формы) на стороне сервера. Для этого существует несколько способов. Вы можете попробовать проверку компонента JSR 303 (hibernate validator) или ESAPI Input Validation framework. Хотя я сам этого не пробовал (пока), есть аннотация, которая проверяет безопасный html (@SafeHtml). На самом деле вы могли бы использовать Hibernate validator с Spring MVC для проверки bean-компонентов -> Ссылка

  2. Экранирование URL-запросов - Для всех ваших HTTP-запросов используйте какой-нибудь XSS-фильтр. Я использовал следующее для нашего веб-приложения, и оно заботится об очистке запроса HTTP URL -http://www.servletsuite.com/servlets/xssflt.htm

  3. Экранированные данные / html возвращаются клиенту (смотрите объяснение @BalusC выше).

java jsp servlets