Предотвращение подделки межсайтовых запросов
Одним из способов предотвращения CSRF является использование токенов в формах. Пройдя много статей, я понял, что шаги, как правило, следующие:
- Создайте значение токена, который зашифрован, сохраните его в сеансе, установите значение токена в скрытом поле в форме.
- На странице обработки формы сравните значение токена в скрытом поле и значение сеанса на равенство следующим образом: $_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...