XSS можно предотвратить в JSP с помощью JSTL
тега или fn:escapeXml()
Функция EL, когда (повторно) управляемый вход. Сюда входят параметры запроса, заголовки, файлы cookie, URL, тело и т. Д. Все, что вы извлекаете из объекта запроса. Кроме того, пользовательский управляемый вход из предыдущих запросов, который хранится в базе данных, должен быть экранирован во время повторного отображения.
Например:
Это приведет к выходу символов, которые могут отобразили HTML, такие как <
, >
, "
, '
и &
в объекты HTML / XML , такие как <
, >
, "
, '
и &
.
Обратите внимание, что вам не нужно избегать их в коде Java (Servlet), так как они безвредны там. Некоторые могут отказаться от них во время обработки запроса (как вы это делаете в Servlet или Filter) вместо обработки response (как и в JSP), но таким образом вы можете рискнуть что данные без необходимости получают двойное экранирование (например, &
становится &
вместо &
, и в конечном итоге конечный пользователь увидит &
) или что данные, хранящиеся в базе данных, становятся недоступными (например, при экспорте данных в JSON, CSV, XLS, PDF и т. Д., Которые вообще не требуют HTML-экранирования). Вы также потеряете социальный контроль, потому что вы больше не знаете, что пользователь действительно заполнил. Вы, как администратор сайта, действительно хотели бы знать, какие пользователи / IP-адреса пытаются выполнить XSS, чтобы вы могли легко отслеживать их и принять соответствующие меры. Эвакуация во время обработки запроса должна использоваться и использоваться только в качестве последнего курорта, когда вам действительно нужно как можно скорее исправить крушение поезда плохо разработанного старого веб-приложения в кратчайшие сроки. Тем не менее, вы должны в конечном счете переписать свои JSP-файлы, чтобы они стали XSS-безопасными.
Если вы хотите повторно отобразить управляемый пользователем ввод как HTML, в котором вы хотели бы разрешить только определенный поднабор HTML-тэгов, например ,
,
и т. д., тогда вам нужно дезинформировать входные данные с помощью белого списка. Для этого можно использовать парсер HTML, например Jsoup . Но гораздо лучше ввести дружественный человеку язык разметки, такой как Markdown (также используемый здесь в Stack Overflow). Для этого вы можете использовать анализатор Markdown, например CommonMark . Он также встроил средства для очистки HTML. См. Также Я ищу Java-кодер Java .
Единственной проблемой на стороне сервера в отношении баз данных является предотвращение SQL injection . Вы должны убедиться, что вы никогда не связываете строки с пользовательским контролем прямо в запросе SQL или JPQL и что вы используете параметризованные запросы полностью. В терминах JDBC это означает, что вместо Statement
вы должны использовать PreparedStatement
. В терминах JPA используйте Query
.
Альтернативой может быть переход из JSP / Servlet в Java MVC framework JSF . Он имеет встроенную поддержку XSS (и CSRF!) По всему месту. См. Также Предотвращение атаки CSRF, XSS и SQL Injection в JSF .