Умный способ сгенерировать ключ FORM с помощью PHP - PullRequest
1 голос
/ 07 ноября 2011

У меня есть форма, в которой я хочу, чтобы пользователи могли отправлять ее только один раз, чтобы они не могли отправить ее и обновить для повторной отправки ... Я думал об отключении $ _POST или перенаправлении, но ни одна из них не сработаетСитуация, как я могу сгенерировать ключ и сделать его так, чтобы его можно было использовать только один раз?Не могу использовать MySQL.

Ответы [ 4 ]

3 голосов
/ 07 ноября 2011

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

Если вы просто не хотите, чтобы пользователь случайно повторно отправил успешно отправленную форму, вам нужна ссылка из комментария @zerkms: http://en.wikipedia.org/wiki/Post/Redirect/Get

1 голос
/ 07 ноября 2011

Самый распространенный способ избежать двойной публикации - это сделать

header('location: /'.$your_url_here);

после завершения ваших действий.Таким образом, вы просто перенаправляете на ту же страницу, но без $ _POST.

0 голосов
/ 10 июля 2016

Я понимаю, что это старый вопрос, но недавно у меня была такая же проблема.Ни одно из решений Post / Redirect / Get не работает на WHMCS, если вы хотите остаться на странице productdetails (например), даже если вы переключаетесь на другой файл шаблона Smarty после POST.Вероятно, потому что ему нужен $ _POST [id '], и он исчезает после обновления.Поэтому самое близкое, что я мог получить, - это вернуться на страницу со списком продуктов, что не то, что я хочу, и, вероятно, не то, что хочет оригинальный плакат.

Решение, которое я наконец-то придумал, было добавить $_SESSION[submitted] переменная после отправки формы.Вам нужно будет самостоятельно определить логику в зависимости от того, что вы делаете.

Моя логика выглядит примерно так:

if ($_SESSION['submitted'] == 1 && !isset($_POST['somecustomkey'])) { unset($_SESSION['submitted']); }

То есть сверху и сбрасывается«отправленный» ключ сеанса, если данные формы POST не существуют.

Затем добавьте проверку, прежде чем записывать информацию в свою базу данных или что-либо подобное.

if ($_SESSION['submitted'] != 1) { //Do some stuff with $_POST form data $_SESSION['submitted'] = 1; }

Я думаю, что это хорошо согласуется с целью $ _SESSION и легко реализуемо.

0 голосов
/ 07 ноября 2011

Установите сеанс или файл cookie, когда форма была отправлена, и проверьте, существует ли она заранее.

Вы также можете хранить информацию в базе данных, такую ​​как их IP-адрес и браузер, если вы хотите постоянную проверку, но этоУ него есть свои проблемы, так что вы никогда не остановите кого-то 100% времени.

...