Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > защита от ДОСеров


Автор: Archon7th 9.10.2008, 15:29
Как отсечь многократное выполнение скрипта если пользователь допустим на форме перехода зажмет доупора Enter
и получится что серия пары SELECT-UPDATE запросов вместо SELECT1-UPDATE1 SELECT2-UPDATE2 SELECT3-UPDATE3 наложится как SELECT1 SELECT2 SELECT3 UPDATE1 UPDATE2 UPDATE3

как от этого защититься или как ограничить число переходов страниц от юзера скажем до 1 клика в секунду




я пробовал вводить Замки через создание переменных и флагов на юзерах
пробовал лочить таблицу, ничего не помагает, сервак очень быстрый 4х ядерный и получается что все запросы всёровно обрабатываются отдновременно, а небольшая задержка базы в несколько мсек оказывается более чем достаточной

уже подумываю добавлять в некоторые места Delay
но всёровно думаю не поможет

Автор: destrd 9.10.2008, 15:38
А что происходит то? Тут и без зажатого Enter такое может быть, пользователи могут одновременно зайти на страницу.

Автор: Archon7th 9.10.2008, 15:40
если пользователи разные, то ничего страшного не произойдет, а вот если пользователь один, то получается наложение, т.к. в UPDATE используется одно и то же поле базы


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

Автор: SamDark 9.10.2008, 16:15
Archon7th, 
http://www.zdziarski.com/projects/mod_evasive/

Автор: georgiy11 9.10.2008, 17:03
Я конечно не профи в этом, но а если сценарий запускать через функцию "засыпания" sleep() или usleep(), перед соединением с БД.

Автор: Deepthroat 9.10.2008, 18:02
А если на стороне клиента запретить отправку данных более одного раза - просто блокировать поля ввода после однократной отправки.

Автор: bobik02 9.10.2008, 18:05
Цитата(Deepthroat @  9.10.2008,  18:02 Найти цитируемый пост)
А если на стороне клиента запретить отправку данных более одного раза - просто блокировать поля ввода после однократной отправки.

легко обойти

Автор: ksnk 9.10.2008, 18:48
Archon7th, А транзакции помогают? Ну, на худой конец - http://www.mysql.ru/docs/man/LOCK_TABLES.html

Добавлено через 1 минуту и 10 секунд
Цитата

пробовал лочить таблицу

Как это - не помогает smile ? Может плохо лочил?

Автор: Archon7th 9.10.2008, 21:29
там проблема тогда в том же:

грубо проблему с локом можно описать так:
LOCKED - проверка замка
LOCK - установка замка
SELECT
UPDATE
UNLOCK

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

LOCKED1=false LOCKED2=false LOCK1 LOCK2 (в этом месте база почемуто еще не залочена первым замком но второй замок иногда не ставится вовсе, хотя LOCKED возвращает всёровно false как для 1 так и для 2 )  SELECT1 SELECT2 UPDATE1 UPDATE2 UNLOCK1 UNLOCK2

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


код немогу привести, т.к. проблема не в одном файлике, а в целой цепочке модулей

Автор: ksnk 9.10.2008, 21:37
Речь идет про mysql?

Вот цитата из документации
Цитата

mysql> LOCK TABLES trans READ, customer WRITE;
mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
mysql> UPDATE customer SET total_value=sum_from_previous_statement
        WHERE customer_id=some_id;
mysql> UNLOCK TABLES;


В каком месте и зачем  вызывается LOCKED?

Автор: solenko 10.10.2008, 12:59
В форму добавляете хидден с уникальным идентификатором поля. Этот же идентификатор записываете пользователю в сессию. По приходу формы на сервер проверяем существует ли в сессии такой идентефикатор. Если да -- ансетим его и начинаем обработку. Если нет -- редирект(ну или просто сообщение о ошибке)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)