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