Текущая проверка:
if (waRequest::post('_csrf') != waRequest::cookie('_csrf')) {
throw new waException('CSRF Protection', 403);
}
Позволяет задать пустые значения и успешно пройти проверку.
Это можно исправить добавив параметр по умолчанию:
if (waRequest::post('_csrf', 1) !== waRequest::cookie('_csrf')) {
throw new waException('CSRF Protection', 403);
}
8 комментариев
А что мне мешает передать одинаковые значения в пост и куки? Если уж делать, то через сессию, но она открывается не сразу. Чтобы усложнить алгоритм, нужно шифровать само название ячейки массива, чтобы боты не смогли использовать шаблон _csrf.
Это уже сложнее реализовать при csrf атаке.
Хранение в сессии - верное решение, но хотя бы такой минимум сделали.
значение csrf вообще надо не полем формы, а в http заголовке запроса передавать. тогда можно защищать не только данные формы и не только post-запросы
не - легко подделать
Поле формы не сложнее. Я не о хранении значения для сравнения. Его и вправду в сессии надо бы
Для форм можно ещё md5 названий полей посоленное csrf. Тогда будет сложнее добавить левое поле в форму
Мне кажется ты рассказываешь про мой код из одного проекта)))
:) это достаточно "стандартные" решения