При нажатии на кнопку Создать вводится много записей

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
aac68@mail.ru
Сообщения: 45
Зарегистрирован: 2013.12.12, 12:51

При нажатии на кнопку Создать вводится много записей

Сообщение aac68@mail.ru »

Добрый день, подскажите, пожалуйста, как решить следующую проблему?
При быстром и частом нажатии на кнопку Создать вводится много записей. javascript помогает, но не надежно, F5 им в помощь. Через session можно, но ни как не клеится. Пока защищаю через MySQL запрос, но думаю это не грамотно, хотя надежно.
esche
Сообщения: 1054
Зарегистрирован: 2010.11.24, 03:39

Re: При нажатии на кнопку Создать вводится много записей

Сообщение esche »

А что создаётся-то? Пользователи идентифицируются как-нибудь?

ИМХО, нормальный вариант - после первого нажатия на кнопку "Создать" блокировать её (Disabled). Разблокировать после добавления записи (если добавляется AJAX-ом, или редиректить на страничку "спасибо, добавлено" - тогда F5 не будет добавлять данные повторно)

Через сессию - фиксировать время последнего добавления и при повторном выводить что-то вроде "создавать ... можно 1 раз в минуту". Можно по IP ограничения добавлять, по комбинациям IP+UserAgent и тд.
Капча - после F5 будет выдавать ошибку, придётся код вводить повторно

Однако, есть смысл выбирать методы в зависимости от ситуации, в которой "защита" требуется.
Потенциально - всё это (кроме капчи) обходится сбросом куки, проксями и прочими плюшками.
...
Аватара пользователя
aac68@mail.ru
Сообщения: 45
Зарегистрирован: 2013.12.12, 12:51

Re: При нажатии на кнопку Создать вводится много записей

Сообщение aac68@mail.ru »

esche писал(а):А что создаётся-то? Пользователи идентифицируются как-нибудь?

ИМХО, нормальный вариант - после первого нажатия на кнопку "Создать" блокировать её (Disabled). Разблокировать после добавления записи (если добавляется AJAX-ом, или редиректить на страничку "спасибо, добавлено" - тогда F5 не будет добавлять данные повторно)

Через сессию - фиксировать время последнего добавления и при повторном выводить что-то вроде "создавать ... можно 1 раз в минуту". Можно по IP ограничения добавлять, по комбинациям IP+UserAgent и тд.
Капча - после F5 будет выдавать ошибку, придётся код вводить повторно

Однако, есть смысл выбирать методы в зависимости от ситуации, в которой "защита" требуется.
Потенциально - всё это (кроме капчи) обходится сбросом куки, проксями и прочими плюшками.
Пользователи зарегистрированные. Оставляют комментарии. С капчей я их мучать не хочу. После сабмита выводить сообщение поможет, но лишний геморрой. А с остальным пока разбираюсь
Аватара пользователя
aac68@mail.ru
Сообщения: 45
Зарегистрирован: 2013.12.12, 12:51

Re: При нажатии на кнопку Создать вводится много записей

Сообщение aac68@mail.ru »

Ну что-то такое придумал:
Controller:
public function postValidation($post){
if(isset($post)){
if(!isset(Yii::app()->session['ftime']) ){
Yii::app()->session['ftime'] = time() ;
return true;
}
if( (time() - Yii::app()->session['ftime']) < 5 ){
Yii::app()->session['ftime'] = time();
return false;
}
else{
Yii::app()->session['ftime'] = time();
return true;
}
}
}

Model controller:

if (!$this->postValidation($_POST['Model'])){
throw new CHttpException(400,'Invalid action.');
}
Ответить