Подделка межсайтовых запросов (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 . |