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 запитів найпростіший метод захисту: заборонити будь-JSON POST/PUT/DELETE
    @RestController
    @RequestMapping(value = AdminRestController.REST_URL, consumes = MediaType.APPLICATION_JSON_VALUE)
    

Ну і наостанок кілька посилань на тему:
Спасибі за увагу і, сподіваюся, Ви вже захотіли запровадити захист від CSRF в Ваш проект.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.