скрипт задержки для замедления личеров

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

Моя хостинговая компания подтверждает, что время сна засчитывается в счет времени выполнения.

Не слишком ли я осторожен на этапе разработки?

Любые предложения о том, как обнаружить и замедлить пользователей, злоупотребляющих сайтом, без использования php sleep?


person Alan C    schedule 08.10.2009    source источник


Ответы (4)


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

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

person Imagist    schedule 08.10.2009
comment
только зарегистрированные пользователи могут загружать, поэтому я согласен с вашим предложением. Я регистрирую время с момента предыдущей загрузки в таблицу БД, поэтому я могу выдать предупреждение, затем подсчитать нарушения за последние 24 часа и остановить их загрузку, если нарушений больше N. Спать не надо :-) - person Alan C; 09.10.2009
comment
Рад слышать, что смог помочь! :) - person Imagist; 10.10.2009
comment
обратная связь: это после того, как какое-то время работало, это, кажется, работает хорошо, до сих пор самое короткое время между загрузками составляет 20 секунд, а в среднем около 50 секунд, я думаю, что люди просматривают и выбирают то, что они хотят загрузить. - person Alan C; 18.01.2010

Почему бы вам просто не сообщить пользователю о том, что он делает «не так», и не отобразить ошибку?

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

person HS.    schedule 08.10.2009

Используйте div со счетчиком времени и реализуйте этот механизм времени в javascript.example: (www.rapidshare.com) Если время сна считается временем выполнения, это означает, что у вас довольно высокий шанс пересечь лимит времени выполнения.

person aviraldg    schedule 08.10.2009
comment
Кроме того, делать это на стороне сервера считается плохим юзабилити, так как пользователь, вероятно, подумает, что ваш сайт не работает. - person aviraldg; 08.10.2009
comment
хорошее предложение, я добавлю это как предупреждение после первого нарушения, которое послужит предупреждением - person Alan C; 09.10.2009

Если какая-либо задержка намного превышает время ожидания выполнения скрипта, вы можете захотеть полностью заблокировать этого пользователя на некоторый период времени (24 часа?).

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

person Eric J.    schedule 08.10.2009
comment
Теперь я записываю сведения о загрузке в БД по идентификатору пользователя, что позволяет мне подробно изучить запись пользователя. - person Alan C; 09.10.2009
comment
Учитывая, что у вас есть идентификатор пользователя, я на 100% согласен с принятым ответом (+1 за него). - person Eric J.; 09.10.2009