Должен ли я использовать Sleep () или просто отказать им - PullRequest
7 голосов
/ 27 июля 2011

Я внедряю систему задержки, чтобы любой IP, который я считаю злоупотребляющим, автоматически получал дополнительную задержку с помощью Sleep ().

Мой вопрос заключается в том, приведет ли это к дополнительному использованию ЦП и, таким образом, в любом случае убьет мой сайт, если злоумышленник просто продолжит открывать новые экземпляры во время задержки?Или команда sleep () использует минимальный процессор / память и не будет большой нагрузкой для маленького скрипта.Я не хотел бы категорически отрицать их, так как предпочел бы, чтобы они не знали о пределе очевидным образом, но хотел бы услышать, почему я должен это делать.маленький сайт, потому что вот почему: я недавно создал скрипт, который проверяет страницу и возвращает информацию пользователю, и заметил, что несколько IP-адресов спамят мой глупый маленький скрипт.Слишком частая проверка иногда делает мои результаты недоступными для сервера, и законные пользователи теряют свои результаты.]

Ответы [ 4 ]

5 голосов
/ 27 июля 2011

Sleep () - это функция, которая блокирует выполнение на определенный промежуток времени. Это не эквивалентно:

while (x<1000000);

Поскольку это приведет к 100% загрузке процессора. Он просто переводит процесс в состояние «Заблокировано» в операционной системе, а затем переводит процесс в состояние «Готово» после включения таймера.

Имейте в виду, однако, что по умолчанию PHP имеет 30-секундный тайм-аут. Я не уверен, соответствует ли Sleep () этому или нет (я бы сомневался, так как это системный вызов вместо скрипта)

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

РЕДАКТИРОВАТЬ: Согласно Имеет ли значение время ожидания для ограничения времени выполнения? , может показаться, что "Sleep ()" не зависит от "максимального времени выполнения" (в Linux), как я ожидал. Видимо, под Windows.

5 голосов
/ 27 июля 2011

В спящем режиме не используется процессор или память, которая еще не используется процессом, принимающим вызов.

Проблема, с которой вы столкнетесь при реализации sleep (), заключается в том, что в конечном итоге у вас закончатся файловые дескрипторыв то время как сайт злоумышленника ждет, пока ваш сон перестанет работать, а затем ваш сайт будет недоступен другим людям, которые пытаются подключиться.

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

Единственная реальная защита здесь - это либо не принимать вызовы, либо иметь динамическую конфигурацию брандмауэра, которая отфильтровывает вызовы, или блок маршрутизатора / брандмауэра, который делает то же самое, но с вашего сервера.

5 голосов
/ 27 июля 2011

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

Меня беспокоит ваш метод повторных злоумышленников, у которых время ожидания достигает нескольких часов.Их потоки будут зависать надолго, даже если они не используют процессор.Есть и другие ресурсы, о которых нужно помнить, кроме только процессора.

1 голос
/ 27 июля 2011

Если вы делаете то же, что и я, я думаю, вы будете в чистоте.

Мой скрипт аутентификации построил что-то похожее на идею Этвуда. Идентификаторы SessionID записывались в ОЗУ и вращались при каждом вызове страницы. Если бы условия не были выполнены, я бы отметил эту конкретную сессию с недостатком. После трех я начал добавлять вызовы sleep () к их выполнению. Лимит был переменным, но я остановился на 3 секундах как счастливое число.

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

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

Это, как говорится, это безопасность через "тип" запутывания, так что вы не можете слишком сильно полагаться на него. Это просто еще один фактор в моем общем рецепте:)

...