Вопрос или проблема
Я пытаюсь реализовать OWASP CSRF Guard в веб-приложении, которое я обновляю (написанном на Java 17, работающем на сервере tomcat 10.1.25). Мы использовали библиотеку ESAPI, но так как мы использовали только 6 уникальных методов из нее, мы решили использовать более мелкие библиотеки. Из всего, что я исследовал, мне действительно нужно использовать OWASP Java HTML Sanitizer и OWASP CSRF Guard. Я успешно реализовал HTML Sanitizer, но не могу решить некоторые проблемы с CSRF Guard.
Я пытался читать и применять пример кода, который нашел:
- GitHub
- Ключ для session.getAttribute() равен null, используя OWASP_CSRFTOKEN в приложении spring framework 3.2.4
- Валидация CSRF/проверка не работает в экспортированных сборках war – при использовании OWASP CSRFGuard
- OWASP CSRFGuard: необходимый токен отсутствует в запросе
Но, похоже, я не понимаю и не применяю это правильно. Вот что происходит:
- Я запускаю свое приложение (из Eclipse)
- сервер запускается без проблем (я вижу вывод конфигурации csrf guard)
- веб-приложение открывается (но изображения и файлы css не загружаются)
- я пытаюсь войти в веб-приложение
- сервлет для входа инициализируется, но метод
doPost()
не выполняется - меня переводит на пустую страницу
Иногда меня сразу переводит на пустую страницу после запуска приложения.
Мой web.xml
выглядит так:
<context-param>
<param-name>Owasp.CsrfGuard.Config</param-name>
<param-value>WEB-INF/csrfguard.properties</param-value>
</context-param>
<listener>
<listener-class>org.owasp.csrfguard.CsrfGuardServletContextListener</listener-class>
</listener>
<listener>
<listener-class>org.owasp.csrfguard.CsrfGuardHttpSessionListener</listener-class>
</listener>
<filter>
<filter-name>AccessFilter</filter-name>
<filter-class>wy.web.app.security.AccessFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>AccessFilter</filter-name>
<url-pattern>/*</url-pattern> <!-- */ -->
</filter-mapping>
<filter>
<filter-name>CSRFGuard</filter-name>
<filter-class>org.owasp.csrfguard.CsrfGuardFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CSRFGuard</filter-name>
<url-pattern>/*</url-pattern> <!-- */ -->
</filter-mapping>
<servlet>
<servlet-name>JavaScriptServlet</servlet-name>
<servlet-class>org.owasp.csrfguard.servlet.JavaScriptServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>JavaScriptServlet</servlet-name>
<url-pattern>/JavaScriptServlet</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
Мой csrfguard.properties
файл выглядит так:
org.owasp.csrfguard.configuration.provider.factory = org.owasp.csrfguard.config.PropertiesConfigurationProviderFactory
org.owasp.csrfguard.Enabled = true
# тестировал и для "true", и для "false"
org.owasp.csrfguard.ValidateWhenNoSessionExists = true
org.owasp.csrfguard.TokenLength = 32
org.owasp.csrfguard.TokenName = OWASP-CSRFTOKEN
org.owasp.csrfguard.SessionKey = OWASP-CSRFTOKEN
org.owasp.csrfguard.PRNG = SHA1PRNG
org.owasp.csrfguard.PRNG.Provider = SUN
org.owasp.csrfguard.Ajax = true
org.owasp.csrfguard.LogicalSessionExtractor = org.owasp.csrfguard.session.SessionTokenKeyExtractor
org.owasp.csrfguard.JavascriptServlet.sourceFile = WEB-INF/Owasp.CsrfGuard.js
org.owasp.csrfguard.JavascriptServlet.domainStrict = false
org.owasp.csrfguard.JavascriptServlet.cacheControl = private, maxage=28800, no-cache, no-store, must-revalidate
org.owasp.csrfguard.JavascriptServlet.refererPattern = .*
# тестировал и для "true", и для "false"
org.owasp.csrfguard.JavascriptServlet.refererMatchProtocol = false
# тестировал и для "true", и для "false"
org.owasp.csrfguard.JavascriptServlet.refererMatchDomain = false
org.owasp.csrfguard.JavascriptServlet.injectIntoForms = true
org.owasp.csrfguard.JavascriptServlet.injectGetForms = true
org.owasp.csrfguard.JavascriptServlet.injectFormAttributes = true
org.owasp.csrfguard.JavascriptServlet.injectIntoAttributes = true
org.owasp.csrfguard.JavascriptServlet.injectIntoDynamicNodes = false
org.owasp.csrfguard.JavascriptServlet.xRequestedWith = OWASP CSRFGuard Project
org.owasp.csrfguard.JavascriptServlet.UnprotectedExtensions = js, css, gif, png, ico, jpg
org.owasp.csrfguard.configOverlay.hierarchy = file:WEB-INF/csrfguard.properties
# Отметить страницу входа как незащищенную, по крайней мере для тестирования
org.owasp.csrfguard.unprotected.Login = %servletContext%/login.jsp
org.owasp.csrfguard.unprotected.Error = %servletContext%/error.jsp
# Действия, которые нужно выполнить, когда обнаружена атака
# 1. Записать информацию
org.owasp.csrfguard.action.Log = org.owasp.csrfguard.action.Log
org.owasp.csrfguard.action.Log.Message = Потенциальная атака подделки межсайтовых запросов (CSRF) предотвращена (пользователь:%user%, ip:%remote_ip%, метод:%request_method%, uri:%request_uri%, ошибка:%exception_message%)
# 2. Поворачивать токен; не поддерживается с AJAX
#org.owasp.csrfguard.action.Rotate = org.owasp.csrfguard.action.Rotate
# 3. Аннулировать токен, который был неправильно использован
#org.owasp.csrfguard.action.Invalidate=org.owasp.csrfguard.action.Invalidate
# 4. Перенаправить пользователя/взломщика на определенную страницу
#org.owasp.csrfguard.action.Redirect = org.owasp.csrfguard.action.Redirect
#org.owasp.csrfguard.action.Redirect.Page = /Owasp.CsrfGuard.Test/error.html
org.owasp.csrfguard.Logger = org.owasp.csrfguard.log.JavaLogger
org.owasp.csrfguard.log.JavaLogger.level = TRACE
org.owasp.csrfguard.Config.Print = true
org.owasp.csrfguard.forceSynchronousAjax = true
Почему не загружается следующая страница? Почему нет ошибок?
Я нашел ответ на этот вопрос, пока писал его! В пункте #5 процесса, который я описал, я подумал о том, чтобы увидеть эту строку в чьем-то другом csrfguard.properties
файле:
org.owasp.csrfguard.ProtectedMethods=POST
Но так как она была закомментирована в файле CSRF Guard, я подумал, что для нее есть какие-то настройки по умолчанию — но, похоже, нет! Добавление этой строки решило проблему!
Я также думаю, что если бы я настроил страницу ошибки, я мог бы заметить эту проблему раньше.
Ответ или решение
Применение OWASP CSRF Guard может представлять определенные сложности, как показала ваша ситуация. Ваш вопрос о возникновении пустых страниц и несрабатывании методов при использовании OWASP CSRF Guard имеет важные аспекты, требующие тщательного анализа.
Анализ проблемы
Из описания вашего случая видно, что проблема начинается с запуска приложения, но проявляется при попытке выполнить авторизацию. Давайте проанализируем несколько ключевых моментов:
-
Инициализация и конфигурация – Вы подтвердили, что сервер успешно загружается, и конфигурация CSRF Guard считывается. Это первый критически важный шаг. Однако важно убедиться, что все параметры конфигурации правильно настроены.
-
Проблема с методами – Вы упомянули, что метод
doPost()
вашего сервлета не выполняется, что может быть связано с неправильной конфигурацией безопасности при использовании CSRF Guard. Важно добавить следующую строку в ваш файлcsrfguard.properties
:org.owasp.csrfguard.ProtectedMethods=POST
Эта настройка явно определяет методы, для которых должна применяться защита от CSRF, что может решать проблему с незаслуженно пустыми страницами.
-
Ошибка перенаправления – Если при попытке входа пользователь оказывается на пустой странице, это может указывать на то, что CSRF Guard блокирует запрос. Проверьте логи вашего приложения или включите более детализированное логирование, чтобы увидеть, фиксирует ли CSRF Guard атаки.
-
Настройки недоступных страниц – Вы обратили внимание на необходимость настройки страницы ошибок. Это очень важно, так как при возникновении ошибки (например, при блокировке CSRF Guard) пользователю должно отображаться предупреждение либо сообщение об ошибке, вместо пустой страницы. Настройка свойств для перенаправления на страницу ошибок может значительно улучшить восприятие пользователем работы приложения.
-
Загрузка ресурсов – Поскольку вы отметили, что изображения и CSS не загружаются, убедитесь, что все статические ресурсы исключены из проверки CSRF. Проверьте свой файл конфигурации CSRF Guard на наличие исключений для ресурсов, таких как CSS и изображения. К примеру:
org.owasp.csrfguard.JavascriptServlet.UnprotectedExtensions = js, css, gif, png, ico, jpg
Заключение и рекомендации
Ваша проблема была решена добавлением строки, определяющей защищенные методы, что подчеркивает важность внимания к деталям при конфигурировании библиотек для безопасности. Чтобы избежать подобных проблем в будущем:
-
Регулярно проверяйте логи – Логи позволят вам быстро находить возможные причины сбоев.
-
Тестируйте изменения конфигурации – Проводите тщательное тестирование после изменения настроек, особенно при использовании таких библиотек, как CSRF Guard.
-
Документируйте конфигурации – Ведите документирование конфигурационных параметров, чтобы облегчить понимание их влияния на работу вашего приложения.
Следуя этим рекомендациям, вы сможете улучшить свою разработку и сделать приложение более устойчивым к атакам.