| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| А если на стороне клиента запретить отправку данных более одного раза - просто блокировать поля ввода после однократной отправки. |
| Автор: ksnk 9.10.2008, 18:48 | ||
| Archon7th, А транзакции помогают? Ну, на худой конец - http://www.mysql.ru/docs/man/LOCK_TABLES.html Добавлено через 1 минуту и 10 секунд
Как это - не помогает |
| Автор: 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? Вот цитата из документации
В каком месте и зачем вызывается LOCKED? |
| Автор: solenko 10.10.2008, 12:59 |
| В форму добавляете хидден с уникальным идентификатором поля. Этот же идентификатор записываете пользователю в сессию. По приходу формы на сервер проверяем существует ли в сессии такой идентефикатор. Если да -- ансетим его и начинаем обработку. Если нет -- редирект(ну или просто сообщение о ошибке) |