Здравствуйте!
Современное веб приложение считается уязвимым, если в нем отсутствует защита от Межсайтовой подделки запроса (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 в Ваш проект.

Комментарии (3)


  1. ShadowsMind
    13.08.2015 18:53

    Не густо, если честно, больше похоже на куски кода из StackOverFlow… Надо было хотя бы показать не стандартные ситуации — например написать свой интерцептор для случая когда template engine не дефолтный, например Mustache/Handlebars etc.


  1. gkislin
    13.08.2015 22:53

    Материал tutorial: JSP, Spring MVC + Security
    Если куда то переходить- то на Thymeleaf… но это уже отдельная статейка


    1. ShadowsMind
      14.08.2015 10:51

      Thymeleaf тоже жирный и медленный и не далеко ушел от JSP, если куда-то переходить, то на Logic-less темплейты, имхо.