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

Тема в разделе "PHP Pro", создана пользователем CrashX, 3 мар 2011.

Статус темы:
Закрыта.
  1. CrashX

    CrashX В прошлом XSiteCMS

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

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

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

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

    Вложения:

    • diagram.jpg
      diagram.jpg
      Размер файла:
      61,1 КБ
      Просмотров:
      29
  2. Mr.Emm

    Mr.Emm Постоялец

    Регистр.:
    5 май 2008
    Сообщения:
    144
    Симпатии:
    107
    PHP:
    $_SESSION['controlpost'] = md5(serialize($_POST));
    Вариант?
     
  3. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    При каждом запросе к шлюзу генерируй 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();
    }
     
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    у меня так хранится время поста) если оно менее 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(); 
    а можно немного пояснить что где создавать
    идея интересная, просто я ее не правильно развиваю, не выходит аленький цветочек (
     
  5. Jeurey

    Jeurey

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

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

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

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    спасибо, это даже немного лучше чем я думал
    если немного разить идею то капча почти ненужна)
     
  7. Jeurey

    Jeurey

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

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

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

    CrashX В прошлом XSiteCMS

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