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

от автора

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

ссылка на оригинал статьи http://habrahabr.ru/post/264641/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *