Вы также можете предотвратить это, используя уникальное поле, такое как адрес электронной почты / имя пользователя или регистрационный номер. Затем проверьте новое поле на соответствие существующему в БД, и, если оно совпадает, то пользователь уже зарегистрировался, и отправка формы должна прекратиться, в противном случае продолжить отправку формы.

редотвратить отправку нескольких форм в несколько кликов в PHP

 Kel06 янв. 2011 г., 11:49
Поскольку вопрос касается поведения на стороне сервера (PHP), я рекомендую взглянуть на следующий вопрос:stackoverflow.com/questions/218907/...
 karim7906 янв. 2011 г., 11:50
<input type="submit" onclick="this.disabled='disabled'"/>
 4 Leave Cover14 февр. 2017 г., 03:28
Является ли Javascript подход быстрее, чем автокликер с> 1000 кликов в секунду?
 Mitch Wheat06 янв. 2011 г., 11:45
отключить кнопку отправки!

Ответы на вопрос(8)

сгенерированный каждый раз при отображении формы и который можно использовать только один раз; это также полезно для предотвращенияCSRF а такжепереигровка атаки. Небольшой пример:

<?php
session_start();

/**
 * Creates a token usable in a form
 * @return string
 */
function getToken(){
  $token = sha1(mt_rand());
  if(!isset($_SESSION['tokens'])){
    $_SESSION['tokens'] = array($token => 1);
  }
  else{
    $_SESSION['tokens'][$token] = 1;
  }
  return $token;
}

/**
 * Check if a token is valid. Removes it from the valid tokens list
 * @param string $token The token
 * @return bool
 */
function isTokenValid($token){
  if(!empty($_SESSION['tokens'][$token])){
    unset($_SESSION['tokens'][$token]);
    return true;
  }
  return false;
}

// Check if a form has been sent
$postedToken = filter_input(INPUT_POST, 'token');
if(!empty($postedToken)){
  if(isTokenValid($postedToken)){
    // Process form
  }
  else{
    // Do something about the error
  }
}

// Get a token for the form we're displaying
$token = getToken();
?>
<form method="post">
  <fieldset>
    <input type="hidden" name="token" value="<?php echo $token;?>"/>
    <!-- Add form content -->
  </fieldset>
</form>

Объедините его с редиректом, чтобы сохранить идеальное поведение вперед и назад. УвидетьPOST / redirect / GET шаблон для получения дополнительной информации о перенаправлении.

 zeckdude12 февр. 2015 г., 04:55
Я думаю, что фильтр отсутствует на $ postsToken = filter_input (INPUT_POST, 'token');
 timetofly27 февр. 2013 г., 20:45
Кто-нибудь знает какие-либо проблемы, такие как проблемы безопасности, с этим кодом?

<input type="hidden" name="form-token" value="someRandomNumber">

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

В большинстве случаев отключенная форма делает свое дело, например, отключив кнопку или добавивreturn false к событию отправки формы (хотя я не уверен, что это работает без jQuery).

 Mike06 янв. 2011 г., 12:00
О, хорошо, кажется, что я немного опоздал с моим ответом ...вычитать другие ответы

а также проверить серверную часть (на тот случай, если они отключили свой JavaScript), которая проверяет, если они только что отправили.

Существует довольно много разных способов сделать проверку на серверной части. Одним из способов было бы установить переменную сеанса, когда они щелкают ее в первый раз, что может дать системе знать, что она обрабатывает. Если они щелкают второй, третий или четвертый раз, он может просто проверить переменную сеанса, и если это указывает на то, что она уже нажата, она не будет обрабатываться.

Это только один пример - вы могли бы использовать это как начало.

потому что в случае временной проблемы с сетью (т. Е. Запрос вообще не прошел), если пользователь решает прервать отправку (клавиша Esc / кнопка «Стоп»), он не может повторить повторную отправку по сети сервис был восстановлен, и вместо этого придется перезагрузить страницу и заполнитьвсе снова формы записи.

Это самый общий ответ на вашу проблему

if (isset($_COOKIE['FormSubmitted']))
{
    die('You may only submit this for,m once per session!');
}

используя уникальное поле, такое как адрес электронной почты / имя пользователя или регистрационный номер. Затем проверьте новое поле на соответствие существующему в БД, и, если оно совпадает, то пользователь уже зарегистрировался, и отправка формы должна прекратиться, в противном случае продолжить отправку формы.

Я делаю следующее на action.php

if($_SESSION && isset($_SESSION['already_submitted'])) {

  # If already submitted just redirect to thank you page

} else {

    # If first submit then assign session value and process the form
    $_SESSION['already_submitted'] = true;

    # Process form

}

Примечание: всегда инициируйте ваши сеансы в заголовке, используя session_start ();

ботку формы (как я знаю, проблема заключается в немедленном отключении кнопки), но, по сути, сделало бы то же самое. Если вы действительно беспокоитесь об этом, вы можете просто показать еще одну кнопку, которая на самом деле ничего не делает. Это может быть нетрадиционный обходной путь, но, тем не менее, обходной.

Ваш ответ на вопрос