Подделка межсайтовых запросов (CSRF) — это атака, которая заставляет конечного пользователя выполнять нежелательные действия в веб-приложении, в котором он / она в настоящее время проходит проверку подлинности. Предотвращение CSRF-атак в приложении Spring MVC / Thymeleaf довольно легко, если вы используете Spring Security 3.2 и выше.
Как проверить?
Для тестирования я создал приложение с ограниченной областью, куда я могу отправить форму. Исходный код формы:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
< form class = "form-narrow form-horizontal" method = "post" th:action = "@{/message}" th:object = "${messageForm}" action = "http://localhost:8080/message" > < fieldset > < legend >Send a classified message</ legend > < div class = "form-group" th:classappend = "${#fields.hasErrors('payload')}? 'has-error'" > < label for = "payload" class = "col-lg-2 control-label" >Payload</ label > < div class = "col-lg-10" > < input type = "text" class = "form-control" id = "payload" placeholder = "Payload" th:field = "*{payload}" name = "payload" /> < span class = "help-block" th:if = "${#fields.hasErrors('payload')}" th:errors = "*{payload}" >May not be empty</ span > </ div > </ div > < div class = "form-group" > < div class = "col-lg-offset-2 col-lg-10" > < button type = "submit" class = "btn btn-default" >Send</ button > </ div > </ div > </ fieldset > </ form > |
Зная, что URL действия был http: // localhost: 8080 / message, я создал отдельную страницу с HTTP-запросом, ссылающимся на этот URL (со всеми параметрами):
01
02
03
04
05
06
07
08
09
10
11
12
|
<! DOCTYPE html> < html > < head > < meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" /> </ head > < body > < input type = "hidden" name = "payload" value = "Hacked content!" /> < input type = "submit" value = "Hack!" /> </ form > </ body > </ html > |
Я вошел в приложение и выполнил вышеуказанный код. Конечно, сервер позволил мне выполнить запрос, потому что мое приложение уязвимо для CSRF-атак. Чтобы узнать больше о тестировании на CSRF, перейдите по этой ссылке: Тестирование на CSRF .
Как обезопасить?
Если вы используете конфигурацию XML с Spring Security, защита CSRF должна быть включена:
1
2
3
4
5
6
7
8
9
|
< security:http auto-config = "true" disable-url-rewriting = "true" use-expressions = "true" > < security:csrf /> < security:form-login login-page = "/signin" authentication-failure-url = "/signin?error=1" /> < security:logout logout-url = "/logout" /> < security:remember-me services-ref = "rememberMeServices" key = "remember-me-key" /> <!-- Remaining configuration --> </ security:http > |
В случае конфигурации Java — она включена по умолчанию.
Начиная с версии Thymeleaf 2.1, токен CSRF будет автоматически добавляться в формы со скрытым вводом:
1
2
3
4
5
6
7
|
< form class = "form-narrow form-horizontal" method = "post" action = "/message" > <!-- Fields --> < input type = "hidden" name = "_csrf" value = "16e9ae08-76b9-4530-b816-06819983d048" /> </ form > |
Теперь при попытке повторить атаку вы увидите ошибку « Отказано в доступе» .
Однако следует помнить, что включение защиты CSRF гарантирует, что для выхода требуется маркер CSRF. Я использовал JavaScript для отправки скрытой формы:
1
2
3
|
< a href = "/logout" th:href = "@{#}" onclick = "$('#form').submit();" >Logout</ a > < form style = "visibility: hidden" id = "form" method = "post" action = "#" th:action = "@{/logout}" ></ form > |
Резюме
В этой короткой статье я показал, как легко вы можете использовать защиту CSRF при работе с Spring MVC (3.1+), Thymeleaf (2.1+) и Spring Security (3.2+). Начиная с Spring Security 4 CSRF будет включен по умолчанию также при использовании конфигурации XML. Обратите внимание, что HTTP-сессия используется для хранения токена CSRF. Но это можно легко изменить. Для более подробной информации смотрите ссылки.
- Я включил конфигурацию CSRF в свой Spring MVC Archetype . Пожалуйста, проверьте!
Ресурсы
- Thymeleaf — интеграция с RequestDataValueProcessor
- Spring Security — CSRF-атаки
- OWASP — Подделка межсайтовых запросов (CSRF)
Ссылка: | Защита от CSRF в Spring MVC, Thymeleaf, приложении Spring Security от нашего партнера по JCG Рафаля Боровца в блоге Codeleak.pl . |