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

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

CrashX

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

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

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

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

Вложения

  • diagram.jpg
    diagram.jpg
    61,1 KB · Просмотры: 29
PHP:
$_SESSION['controlpost'] = md5(serialize($_POST));
Вариант?
 
При каждом запросе к шлюзу генерируй 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();
}
 
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(); 
}
а можно немного пояснить что где создавать
идея интересная, просто я ее не правильно развиваю, не выходит аленький цветочек (
 
Вообщем. Расписываю идею.
Каждый запрос на сервер должен быть "подписан" определенным ключем. Этот ключ устанавливается предыдущим запросом. Поясняю.

Человек открывает первый раз страницу - генерируется ключ "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...

Теперь объяснение. Как только первый запрос прошел верно - все последующие запросы с устаревшим ключиком не работают.
 
спасибо, это даже немного лучше чем я думал
если немного разить идею то капча почти ненужна)
 
Ну это реализовывалось как-раз против возможной двойной отправки данных на сервер (правда, там подразумевался факт случайной отправки).

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

А по поводу контроля - его все-равно делать нужно. Просто можно юзать не базу, а nosql-хранилище.
 
ну если спамер у меня уже не только post_time но и post_count есть
если время не вышло и набирает кол-во постов подряд =5 банан на 30 минут, отдаю в хеадере эррор 404 )
надеюсь поисковик не будет таким наглым )
мне как бы нужна была только защита от случайного двойного нажатия и отправки а защита от ботов, не стоит сильно заморачиватся. просто стоит ввести динамическое поле которое проверяется это отсечет добрую половину ботов
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху