Pull to refresh

Spring Security 4 + CSRF (добавление в Spring проект защиты от межсайтовой подделки запроса)

Reading time2 min
Views39K


Здравствуйте!
Современное веб приложение считается уязвимым, если в нем отсутствует защита от Межсайтовой подделки запроса (CSRF).
В Spring Security 4.x она включена по умолчанию, поэтому при миграции с Spring Security 3.x на 4.x ее надо либо отключить
<http>
	...
	<csrf disabled="true"/>
</http>
либо, правильнее и зачетнее, добавить в проект.

Собственно, сделал это в 10-минутном видео:


Ниже приведу основные моменты внедрения CSRF в проект:


  1. Использовать правильные HTTP запросы: по умолчанию CSRF защита отсутствует для запросов GET, HEAD, TRACE, OPTIONS. Это в частности означает, что для logout, если мы не хотим, чтобы злоумышленный сайт мог разлогинить пользователя, авторизованного в нашем приложении, требуется запрос POST.
  2. Во всех формах, где есть 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>
    

  3. Для 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);
    });
    

  4. Наконец для stateless REST запросов самый проcтой метод защиты: запретить любой не-JSON POST/PUT/DELETE
    @RestController
    @RequestMapping(value = AdminRestController.REST_URL, consumes = MediaType.APPLICATION_JSON_VALUE)
    


Ну и напоследок несколько ссылок на тему:



Спасибо за внимание и, надеюсь, Вы уже захотели внедрить защиту от CSRF в Ваш проект.
Tags:
Hubs:
Total votes 14: ↑10 and ↓4+6
Comments3

Articles