Решение проблем

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
#1 мультипостинг (когда сообщение отправляется несколько раз)
как бороться
-первое что у меня есть js им я удаляю все из полей после сабмит (но это не катит против хрума, или банально отключенного js)
-далее удаляю массив $_POST но при обновлении страницы он создается снова... толку нет.
-делаю редирект, если вернутся на страницу с редиректом можно добавить еще раз.
-в сессии храню время последнего постинга если оно меньше чем в конфиге тупо редиректить. но по выходу таймаута можно запостить еще... некатит.

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

как в пределах 1 запроса на insert при вот такой БД можно узнать было ли это сообщение добавлено
пока идею сделать селект с содержимым всех полей которые я получаю с формы. )

какие есть идею по этому поводу?
 

Вложения

  • diagram.jpg
    diagram.jpg
    61,1 KB · Просмотры: 29

Mr.Emm

Постоялец
Регистрация
5 Май 2008
Сообщения
153
Реакции
117
PHP:
$_SESSION['controlpost'] = md5(serialize($_POST));
Вариант?
 

Jeurey

Хранитель порядка
Регистрация
13 Сен 2006
Сообщения
419
Реакции
614
При каждом запросе к шлюзу генерируй request_key. При запросе - проверяй соответствие.

PHP:
# gateway.php
if( isset($_SESSION['request_key']) {
   if($_REQUEST['request_key'] != $_SESSION['request_key']) {
       throw new Exception('Invalid request key');
   }
} else {
    $_SESSION['request_key'] = my_random_string();
}
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
PHP:
$_SESSION['controlpost'] = md5(serialize($_POST));
Вариант?
у меня так хранится время поста) если оно менее 30 сек то редирект в корень модуля.
а если человек открыл несколько страниц для написания текста, то он будет заблочен а если удаляю после то можно постить еще -

Jeurey
PHP:
# gateway.php 
if( isset($_SESSION['request_key']) { 
   if($_REQUEST['request_key'] != $_SESSION['request_key']) { 
       throw new Exception('Invalid request key'); 
   } 
} else { 
    $_SESSION['request_key'] = my_random_string(); 
}
а можно немного пояснить что где создавать
идея интересная, просто я ее не правильно развиваю, не выходит аленький цветочек (
 

Jeurey

Хранитель порядка
Регистрация
13 Сен 2006
Сообщения
419
Реакции
614
Вообщем. Расписываю идею.
Каждый запрос на сервер должен быть "подписан" определенным ключем. Этот ключ устанавливается предыдущим запросом. Поясняю.

Человек открывает первый раз страницу - генерируется ключ "A", в сессию пишется $_SESSION['request_key'] = "A", в тело страницы передается request_key = "A".

Отправляется AJAX-запрос, в теле запроса передается request_key = "A". Нужно сказать, что необходимо сразу после валидации этого request_key изменять его. К примеру, на "B". Это механика.


Теперь пример:
$_SESSION['request_key'] = A
AJAX {request_key=A}. Request key is valid. $_SESSION['request_key'] = "B"
AJAX {request_key=A}. Request key is invalid...

Теперь объяснение. Как только первый запрос прошел верно - все последующие запросы с устаревшим ключиком не работают.
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
спасибо, это даже немного лучше чем я думал
если немного разить идею то капча почти ненужна)
 

Jeurey

Хранитель порядка
Регистрация
13 Сен 2006
Сообщения
419
Реакции
614
Ну это реализовывалось как-раз против возможной двойной отправки данных на сервер (правда, там подразумевался факт случайной отправки).

В твоем случае это не сработает в случае нормального открытия формы отправки сообщения и повторного ввода текста. А вот от случаев, тобою описаных - запросто: обычный refresh с ресабмитом.

А по поводу контроля - его все-равно делать нужно. Просто можно юзать не базу, а nosql-хранилище.
 

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
682
Реакции
114
ну если спамер у меня уже не только post_time но и post_count есть
если время не вышло и набирает кол-во постов подряд =5 банан на 30 минут, отдаю в хеадере эррор 404 )
надеюсь поисковик не будет таким наглым )
мне как бы нужна была только защита от случайного двойного нажатия и отправки а защита от ботов, не стоит сильно заморачиватся. просто стоит ввести динамическое поле которое проверяется это отсечет добрую половину ботов
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху