Привет,
А поясните, пожалуйста по защите от CSRF.
Реализация в Drupal 8 такова, что в запрос к своему кастомному URL надо добавить token: специальный параметр или header в зависимости от метода проверки (_csrf_token или _csrf_request_header_token). Этот токен можно свободно получить получить по URL /session/token (GET).
Мне не очень понятно, от чего защищает такая защита.
1. С одной стороны, если некий скрипт имеет возможность обратиться к моему кастомному URL (POST), то что ему помешает предварительно сделать GET-запрос на /session/token?
2. С другой стороны есть обсуждение, почему небезопасно помещать этот token в drupalSettings:
https://drupal.stackexchange.com/questions/270792/is-it-a-security-issue-to-put-csrf-token-in-drupal-settingsНО при этом:
- токен форма в явном виде вписывается в HTML form > input и может быть прочитан любым скриптом прямо из DOM
- любой скрипт, который получает и передает токен, так или иначе хранит его в памяти, т. е. его можно извлечь
3. POST-запросы с другого домена в любом случае идут от имени анонимного пользователя (авторизационная cookie с сессией игнорируется). Т. е. мы говорим только о защите от скриптов, которые выполняются в контексте страницы сайта.
4. Токены не меняются со временем. По сути они просто привязаны к сессии и непонятно, зачем эта новая сущность, если и так есть session ID. Я проверил: и форма при перезагрузке не меняет свой CSRF token, и /session/token выдает всегда одно значение день ото дня.
Можете объяснить, от какого типа атак защищает такая защита вообще?
Хочется защититься от CSRF правильно, но то ли реализация в Друпале некорректная, то ли я чего-то не понимаю.