XSS можно предотвратить в JSP с помощью тега JSTL <c:out>
или fn:escapeXml()
EL при (повторном) отображении user- контролируемый вход . Сюда входят параметры запроса, заголовки, файлы cookie, URL, тело и т. Д. Все, что вы извлекаете из объекта запроса. Кроме того, пользовательский ввод из предыдущих запросов, который хранится в базе данных, должен быть экранирован во время повторного отображения.
Например:
<p><c:out value="${bean.userControlledValue}"></p>
<p><input name="foo" value="${fn:escapeXml(param.foo)}"></p>
Это приведет к тому, что символы, которые могут искажать отображаемый HTML, такие как <
, >
, "
, '
и &
, превратятся в сущности HTML / XML , такие как <
, >
, "
, '
и &
.
Обратите внимание, что вам не нужно экранировать их в коде Java (сервлета), поскольку они там безвредны. Некоторые могут отказаться от них во время обработки запроса (как вы делаете в Servlet или Filter) вместо обработки response (как вы делаете в JSP), но в этом случае вы рискуете, что данные излишне экранируются (например, &
становится &amp;
вместо &
, и в конечном итоге конечный пользователь увидит &
представление), или что данные, хранящиеся в БД, становятся непереносимыми (например, при экспорте данных в JSON, CSV, XLS, PDF и т. Д., Которые вообще не требуют экранирования HTML). Вы также потеряете социальный контроль, потому что вы больше не знаете, что на самом деле заполнил пользователь. Вы, как администратор сайта, действительно хотели бы знать, какие пользователи / IP-адреса пытаются выполнить XSS, чтобы вы могли легко отслеживать их и принять меры соответственно. Экранирование во время обработки запроса следует использовать только в качестве последнего средства, когда вам действительно необходимо в кратчайшие сроки исправить крушение поезда плохо разработанного устаревшего веб-приложения. Тем не менее, в конечном итоге вам следует переписать файлы JSP, чтобы они стали безопасными для XSS.
Если вы хотите снова отобразить ввод, управляемый пользователем, в виде HTML, в котором вы хотите разрешить только определенное подмножество тегов HTML, таких как <b>
, <i>
, <u>
и т. Д., То вам необходимо санировать ввод белый список. Для этого вы можете использовать анализатор HTML, например Jsoup . Но гораздо лучше ввести дружественный для человека язык разметки, такой как Markdown (также используемый здесь при переполнении стека). Тогда вы можете использовать для этого анализатор Markdown, например CommonMark . Он также имеет встроенные возможности очистки HTML. См. Также Я ищу кодировщик Java HTML .
Единственной проблемой на стороне сервера в отношении баз данных является SQL-инъекция предотвращение. Вам нужно убедиться, что вы никогда не объединяете строки, контролируемые пользователем, прямо в запросе SQL или JPQL и что вы все время используете параметризованные запросы. В терминах JDBC это означает, что вы должны использовать PreparedStatement
вместо Statement
. В терминах JPA используйте Query
.
Альтернативой может быть миграция из JSP / Servlet в инфраструктуру MVC Java EE JSF . Он имеет встроенную XSS (и CSRF!) Профилактику повсеместно. См. Также Предотвращение атак CSRF, XSS и SQL-инъекций в JSF .