Java 5 HTML для предотвращения XSS - PullRequest
6 голосов
/ 25 февраля 2010

Я смотрю некоторые предупреждения XSS в моем приложении Java.

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

В настоящее время я не кодирую данные, которые отправляются в базу данных, но хотел бы также начать это делать.

Существуют ли какие-либо встроенные методы, которые могут помочь мне достичь этого?

Ответы [ 3 ]

9 голосов
/ 25 февраля 2010

Обычно вы отключаетесь от XSS во время отображения , а не во время store . В JSP вы можете использовать тег JSTL (просто поместите jstl-1.2.jar in /WEB-INF/lib) <c:out> или fn:escapeXml функция для этого. Э.Г.

<input name="foo" value="<c:out value="${param.foo}" />">

или

<input name="foo" value="${fn:escapeXml(param.foo)}">

Вот и все. Если вы делаете это во время обработки ввода и / или сохранения в БД, то все это распространяется по бизнес-коду и / или в базе данных. Вы не должны этого делать, это всего лишь проблемы с обслуживанием, и вы рискуете двойным побегом или больше, если будете делать это в разных местах (например, & станет &amp;amp; вместо &amp;, так что конечный пользователь будет буквально видеть &amp; вместо & в поле зрения. Код и БД не чувствительны для XSS. Только представление есть. После этого вам нужно экранировать только прямо здесь .

Обновление : вы опубликовали 4 темы на эту тему:

Я только предупреждаю вас: вам не нужно экранировать его в сервлете / фильтре / javacode / database / что угодно. Вы только излишне усложняете вещи. Просто избегайте этого во время показа. Вот и все.

5 голосов
/ 11 февраля 2011

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

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

Нельзя просто слепо сбежать:

  • Возможно, вы захотите, чтобы пользователи вводили подмножество HTML (или ссылки и полужирные теги).
  • Побег не мешает XSS

Я рекомендую использовать библиотеку OWASP Antisammy с рекомендациями Aspect или @ futtta для фильтра.

Ниже приведен аспект, который я написал для очистки пользовательского ввода с использованием аннотаций Spring MVC (поскольку мы используем его для всего нашего ввода).

@SuppressWarnings("unused")
@Aspect
public class UserInputSanitizerAdivsor {

    @Around("execution(@RequestMapping * * (..))")
    public Object check(final ProceedingJoinPoint jp) throws Throwable {
        Object[] args = jp.getArgs();
        if (args != null) {
            for (int i = 0; i < args.length; i++) {
                Object o = args[i];
                if (o != null && o instanceof String) {
                    String s = (String) o;
                    args[i] = UserInputSanitizer.sanitize(s);
                }
            }
        }
        return jp.proceed(args);
    }
}

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

Если вы не хотите проводить дезинфекцию для определенных входных данных, вы всегда можете сделать аннотацию, которая сделает аспект не дезинфицирующим.

Другая причина, по которой вам не нужны вредоносные данные в вашей базе данных, заключается в том, что вы предоставляете какой-либо REST API в Интернет. Вы можете делать правильные вещи на выходе, но ваши партнеры по mashup не могут.

Санация ввода или блокировка ввода - это нормально (я имею в виду, что большинство людей имеют ограничение на загрузку файлов, верно?). Большинству полей в веб-приложении не нужны теги скрипта для ввода, и, что более важно, большинству ваших пользователей, вероятно, не нужно или не нужно вводить теги скрипта (очевидное исключение - ответы переполнения стека).

5 голосов
/ 25 февраля 2010

не встроенный, но проверьте фильтр owasp esapi , он должен делать то, что вы ищете и многое другое. Это отличная библиотека безопасности с открытым исходным кодом, написанная умными парнями и девушками из Owasp («Проект безопасности открытого веб-приложения»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...