Предотвращение подделки межсайтовых запросов

Одним из способов предотвращения CSRF является использование токенов в формах. Пройдя много статей, я понял, что шаги, как правило, следующие:

  1. Создайте значение токена, который зашифрован, сохраните его в сеансе, установите значение токена в скрытом поле в форме.
  2. На странице обработки формы сравните значение токена в скрытом поле и значение сеанса на равенство следующим образом: $_POST['token'] == $_SESSION['token']

У меня вопрос, почему я должен зашифровать значение токена? Предполагая, что я использую метод GET, и злоумышленник знает, что я собираюсь использовать простое целочисленное значение, скажем, от 1 до 1000. Если злоумышленник собирается использовать изображение для подделки запроса, то он должен будет отправить 1000 изображений грубая сила просьба.. верно? или есть другой способ сделать это?

Также я прочитал, что одного только метода POST недостаточно для предотвращения запросов CSRF. Итак, мой второй вопрос: если это правда, как злоумышленник может успешно создать поддельный запрос, если я использую метод POST?

1 ответ

Для злоумышленника, использующего множество автоматизированных процессов и приложений, выполняющих запросы в 1000 переборов, это вопрос нескольких минут.

Поэтому хорошо установить токен так:

$token = md5(uniqid(rand(), true));

Таким образом, вы всегда получаете уникальный случайный токен, в то время как шифрование вообще не требуется - оно просто добавляет больше запутывания:-). Используйте предпочитаемый метод шифрования, кто-то использует только sha1() в наши дни некоторые идут дальше. Но это не безопасная зона Пентагона, а случайный токен, о котором нелегко догадаться, совершая атаки методом грубой силы.

Использование метода POST действительно недостаточно - я установил расширение для моего Firefox, которое может выбрать URL с параметрами GET и преобразовать его в запрос POST. Легко, как копировать + вставить + клик.

Кроме того, вам не нужно устанавливать токен в скрытое поле, вы также можете использовать его в качестве параметра GET URL-адреса действия формы при чтении токена из GET и данных формы из массива POST...

Другие вопросы по тегам