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


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

8 60

8 ответов:

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

для пример:

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

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

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

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

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


альтернативой было бы перейти с JSP / Servlet на Java EE MVC framework JSF. Он имеет встроенный XSS (и CSRF!) профилактика по всему месту. Смотрите также CSRF, XSS и SQL Injection attack prevention in JSF.

how-to-prevent-xss был задан несколько раз. Вы найдете много информации в StackOverflow. Кроме того, на веб-сайте OWASP есть шпаргалка XSS prevention что вы должны пройти.

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

Мне очень повезло с 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:из частности, если вы делаете много javascript.

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

  1. Вход Проверки (проверка формы) на стороне сервера. Есть несколько способов сделать это. Вы можете попробовать JSR 303 bean validation ( hibernate validator), или ESAPI input Validation framework. Хотя я сам не пробовал (пока), есть аннотация, которая проверяет безопасный html (@SafeHtml). Вы могли бы на самом деле использовать Hibernate validator с Spring MVC для валидаций bean -> Ref
  2. экранирование URL-запросов - для всех ваших HTTP-запросов используйте какой-то фильтр XSS. Я использовал следующее для нашего веб-приложения, и он заботится об очистке запроса HTTP URL -http://www.servletsuite.com/servlets/xssflt.htm
  3. экранирование данных / html вернулся к клиенту (смотрите выше на @BalusC объяснение).

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

Skipfish - это инструмент с открытым исходным кодом от Google, который я расследовал: он находит довольно много вещей, и, кажется, стоит использовать.

там нет легко, из коробки решение против XSS. API OWASP ESAPI имеет некоторую поддержку для экранирования, что очень полезно, и у них есть библиотеки тегов.

мой подход состоял в том, чтобы в основном расширить теги stuts 2 следующими способами.

  1. изменить тег s: property, чтобы он мог принимать дополнительные атрибуты, указывающие, какой тип экранирования требуется (escapeHtmlAttribute="true" и т. д.). Это включает в себя создание нового свойства и классов PropertyTag. свойство класс использует OWASP ESAPI api для экранирования.
  2. измените шаблоны freemarker, чтобы использовать новую версию свойства s:и установите экранирование.

Если вы не хотите изменять классы на шаге 1, другой подход будет заключаться в импорте тегов ESAPI в шаблоны freemarker и экранировании по мере необходимости. Затем, если вам нужно использовать тег s:property в вашем JSP, оберните его и тег ESAPI.

Я написал более подробное объяснение здесь.

http://www.nutshellsoftware.org/software/securing-struts-2-using-esapi-part-1-securing-outputs/

Я согласен, что экранирование входов не идеально.

мое личное мнение, что вы должны избегать использования страниц JSP/ASP/PHP/etc. Вместо этого выводите в API, подобный SAX (только предназначенный для вызова, а не для обработки). Таким образом, есть один слой, который должен создать хорошо сформированный выход.

Если вы хотите автоматически избежать все переменные JSP без явной обертки каждой переменной, вы можете использовать El resolver как подробно здесь с полным исходным кодом и примером (JSP 2.0 или новее), и обсуждается более подробно здесь:

например, с помощью вышеупомянутого El resolver, ваш код JSP останется таким же, но каждая переменная будет автоматически экранирована resolver

...
<c:forEach items="${orders}" var="item">
  <p>${item.name}</p>
  <p>${item.price}</p>
  <p>${item.description}</p>
</c:forEach>
...

Если вы хотите принудительно экранировать по умолчанию весной, вы также можете рассмотреть это, но он не избегает выражений EL, просто вывод тегов, я думаю:

http://forum.springsource.org/showthread.php?61418-Spring-cross-site-scripting&p=205646#post205646

Примечание: Можно найти другой подход к экранированию EL, который использует преобразования XSL для предварительной обработки файлов JSP здесь:

http://therning.org/niklas/2007/09/preprocessing-jsp-files-to-automatically-escape-el-expressions/