Здравствуйте!
Современное веб приложение считается уязвимым, если в нем отсутствует защита от Межсайтовой подделки запроса (CSRF).
В Spring Security 4.x она включена по умолчанию, поэтому при миграции с Spring Security 3.x на 4.x ее надо либо отключить
<http>
...
<csrf disabled="true"/>
</http>
либо, правильнее и зачетнее, добавить в проект.Собственно, сделал это в 10-минутном видео:
Ниже приведу основные моменты внедрения CSRF в проект:
- Использовать правильные HTTP запросы: по умолчанию CSRF защита отсутствует для запросов GET, HEAD, TRACE, OPTIONS. Это в частности означает, что для logout, если мы не хотим, чтобы злоумышленный сайт мог разлогинить пользователя, авторизованного в нашем приложении, требуется запрос POST.
- Во всех формах, где есть submit, добавить скрытое поле name=_csrf со значением csrfToken. Проще всего это сделать через Spring’s form tag library, который, кроме биндинга и валидации, при включенном csrf подставит в форму требуемое скрытое поле.
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %> ... <form:form method="post" ...> ... </form:form>
- Для ajax запросов csrf токен добавляется в заголовок (header). Причем можно это сделать сразу для всех ajax запросов.
<sec:csrfMetaTags />
var token = $("meta[name='_csrf']").attr("content"); var header = $("meta[name='_csrf_header']").attr("content"); $(document).ajaxSend(function(e, xhr, options) { xhr.setRequestHeader(header, token); });
- Наконец для stateless REST запросов самый проcтой метод защиты: запретить любой не-JSON POST/PUT/DELETE
@RestController @RequestMapping(value = AdminRestController.REST_URL, consumes = MediaType.APPLICATION_JSON_VALUE)
Ну и напоследок несколько ссылок на тему:
- Spring Security CSRF Protection
- Are JSON web services vulnerable to CSRF attacks
- Правило ограничения домена (SOP)
- Cross-origin resource sharing (CORS)
Спасибо за внимание и, надеюсь, Вы уже захотели внедрить защиту от CSRF в Ваш проект.