Отключите пользователей от нажатия кнопки "Отправить", если он уже нажал на нее в пасте 7 минут

-8

Я хочу отключить кнопку "Отправить" в течение 7 минут, и мне нужен текст рядом с формой: "Подождите 7 минут до отправки". И когда отсчет вниз, я хочу текст, говорящий "Теперь вы можете отправить".

<form action="" method="post" name="myform" id="myform" onsubmit="return formSubmit(this);" class="form-wrapper cf">
<input name="statusid" autocomplete="off" id="statusid" placeholder="Enter ID" required="" type="text">
<button name="submit_btn" class="submit" id="submit_btn" type="submit">Submit</button>
</form>

спросил(а) 2014-01-15T02:24:00+04:00 7 лет, 1 месяц назад
0
74

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

(1) Когда пользователь нажимает кнопку и передает форму, вам нужно установить переменную сеанса PHP, удерживающую текущее время. Поэтому, если пользователи отправляют форму, чтобы сказать doSomething.php то там, где вы обрабатываете набор данных формы $_SESSION['formSubmitTime'] = microtime(true);

(2) Затем вернитесь на свою страницу, содержащую форму, которую вы читаете $_SESSION['formSubmitTime'] и сравните ее с текущим временем. Если прошло более 7 минут, включите кнопку.

$time_end = microtime(true);
$secondsElapsed = $time_end - $_SESSION['formSubmitTime'];

echo "Form submitted $secondsElapsed seconds ago\n";


Если $secondsElapsed больше 420, тогда покажите кнопку, иначе отключите ее.

(3) Это должно привести вас туда, куда вы хотите отправиться. Но вы можете сделать еще один шаг и не требовать обновления страницы. Для этого вам нужно будет сделать код выше, но затем установить обратный отсчет JavaScript, начиная с правильного числа, на основе уже прошедших секунд. Так что скажем $secondsElapsed выше было 100 секунд. Тогда у вас будет код JavaScript, который будет делать setTimeout через 320 секунд (420 секунд = 7 минут) (420-100 = 320 секунд слева). Так что это будет выглядеть примерно так: setTimeout(function(){/*your code to turn the button back on*/},320000);

UPDATE - Спасибо, что разместили свой код формы. Вот более полный пример. (это было быстро напечатано, поэтому у него могут быть опечатки, но должно быть много, чтобы вы указали в правильном направлении.) Надеюсь, это поможет.

<script>
function allowSubmit(){
//change the text
$("#msgText").text('You can submit the form again.');
//enable the button
$("#submit_btn").removeAttr('disabled');
}
</script>

<?php
//If $_SESSION['formSubmitTime'] is not defined then that means they have never submitted. So they don't have to wait
if (!isset($_SESSION['formSubmitTime']))
{
$secondsToWait = 0;
}
else
{
$time_end = microtime(true);
$secondsElapsed = $time_end - $_SESSION['formSubmitTime']; //remember to set this back on the page you post to
$secondsToWait = 420-$secondsElapsed;
}

echo'
<form action="" method="post" name="myform" id="myform" onsubmit="return formSubmit(this);" class="form-wrapper cf">
<input name="statusid" autocomplete="off" id="statusid" placeholder="Enter ID" required="" type="text">
<button name="submit_btn" class="submit" id="submit_btn" type="submit" '.$secondsToWait > 0?"disabled":"".'>Submit</button>
</form>';

if ($secondsToWait > 0)
{
echo'<span id="msgText">You must wait '.$secondsToWait.' seconds.</span>
<script>setTimeout(function(){ allowSubmit() },'.$secondsToWait.'000);</script>';
}
else
echo'<span id="msgText">You can submit the form again.</span>';
?>

ответил(а) 2014-01-15T03:11:00+04:00 7 лет, 1 месяц назад
74

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

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

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

ответил(а) 2014-01-15T02:30:00+04:00 7 лет, 1 месяц назад
43

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

Прежде всего без надлежащего разрешения (закрытая регистрация или facebook gmail и т.д.). Это никогда не будет на самом деле безопасным. Вопрос в том, что вы можете сделать, чтобы усложнить нарушение.

Проще всего сделать и проще всего прорваться - это просто скрипт js. Отключить кнопку в течение 7 минут с помощью jQuery('button').prop('disable',true) (из библиотеки jQuery), а не добавлять setTimeout(function(){jQuery('button').prop('disable',false)}) должен сделать трюк. Однако для нарушения этого вам просто нужна консоль js или даже firebug. Немного лучше, вы также можете добавить cookie на кнопку отключения и проверить его при включении кнопки. Однако консоль и firebug снова победят.

Другая безопасность, которую мы можем добавить, уже использует технологии back end.

1. Мы запускаем обратный отсчет, создавая запись файла или базы данных (я настоятельно рекомендую использовать базу данных, но иногда у вас нет или просто не используйте базу данных в другом месте) с двумя вещами: уникальный ключ с этого момента называется id (разные каждый раз, например, AUTO_INCREMENT) и AUTO_INCREMENT времени (если у нас есть несколько кнопок или событий, мы также можем использовать идентификатор события/кнопки). Затем мы отправляем этот уникальный идентификатор в виде cookie в браузер пользователя (если у нас есть несколько событий, мы отправляем идентификатор пары и идентификатор кнопки/события). 2. В интерфейсе мы создаем скрипт, добавленный как в первом случае. после того, как пользователь нажимает кнопку, скрипт back end проверяет, имеет ли идентификатор из cookie временную метку старше 7 минут, и если да, то она передает файл. Если это не ошибка возврата или все, что вы хотите. Мы также можем добавить ajax для проверки каждые 30 минут, например, сколько осталось в этом случае, если кто-то, например, закроет браузер или что-то еще, мы всегда можем показать им нужное количество оставшегося времени. Чем длиннее (сложнее) вы будете делать уникальный идентификатор, тем сильнее будет скрипт, потому что будет просто сложнее использовать некоторый идентификатор, используемый другим пользователем. В случае использования ранее упомянутого AUTO_INCREMENT вы можете просто использовать этот идентификатор для некоторой сложной строки.

Это решение остановит 90% спамеров. Но в основном потому, что 90% из них ничего не знают о кодировании. Фактически иметь дело с кукисами никогда не бывает так просто, когда дело доходит до написания ботов.

Другой способ сделать это - добавить к вашей записи (только вариант БД) IP пользователя. В этом случае они не смогут просто поймать кого-то еще cookie, потому что им также придется поймать свой IP-адрес, который уже намного сложнее. Это также устранит этих людей, которые могут подождать 7 минут, но не хотят ждать еще несколько минут для загрузки. Например, начиная счетчик 1000 раз, а затем получать 1000 результатов через 7 минут (что должно занять 7000 минут). Этого достаточно, чтобы дать только один запрос для всех на одном ip. Однако у этого есть некоторые минусы. Что произойдет, если два человека используют тот же самый Wi-Fi? Один из них будет заблокирован на 7 минут.

Последний и самый простой способ сделать это - использовать авторизацию. Используйте идентификатор пользователя и сохраните его с отметкой времени, а не просто проверьте, заняло ли пользователь с этой меткой времени более 7 минут. Однако, если наша система не выполнена правильно, не очень сложно использовать бота для регистрации для новых учетных записей. Это почему закрытая регистрация (пользователь не может зарегистрироваться самостоятельно, и вы делаете это вручную, проверяя их достоверность). Вы также можете использовать социальные профили. Однако регистрация там открыта, но весь процесс намного сложнее, и поддельные учетные записи все время закрываются, потому что администраторы проверяют их доступ.

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

ответил(а) 2014-01-15T03:32:00+04:00 7 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема