Определить, поступает ли запрос от нового пользователя

#php #forms #security

#php #формы #Безопасность

Вопрос:

Допустим, у вас есть форма. И вы не хотите, чтобы на нем были уродливые captcha, если это не является абсолютно необходимым.

Таким образом, вы позволяете пользователю отправлять форму, и если тот же пользователь отправляет форму снова, покажите captcha или что-то еще.

Можно ли определить, поступает ли отправка 2-й формы от того же пользователя?

Я знаю о $_SERVER['REMOTE_ATTR'] (который является IP-адресом пользователя), но надежно ли это? Поскольку эта переменная хранит значение, отправленное пользователем, я думаю, любой бот может подделать это, верно?

Комментарии:

1. Почему бы не использовать сеансы / файлы cookie? «Обнаружение» конкретного пользователя или браузера всегда будет по своей сути ошибочным с использованием данных, отправляемых браузером.

2. $_SERVER['REMOTE_ATTR'] не отправляется браузером. Это адрес, на который ваш веб-сервер адресует HTTP-пакеты. К сожалению, он не может работать как идентификатор для вас, потому что многие пользователи могут быть скрыты за 1 IP-адресом через NAT (плюс другие недостатки). Вам придется придерживаться сеансовых файлов cookie.

3. На самом деле я не думаю, что сеансы / файлы cookie помогут, потому что, скорее всего, спам-боты не будут сохранять и отправлять ваши файлы cookie обратно, чтобы они могли отправлять их столько раз, сколько захотят.

Ответ №1:

Вы можете пройти 2 маршрута. Вы можете либо использовать переходящий токен csrf, либо сохранить флаг в сеансе. Флаг сеанса немного более понятен:

 session_start();
if(!isset($_SESSION['submit_flag'])){
   $_SESSION['submit_flag']=true
   //perform action...
}