Я хотел знать, как я могу предотвратить использование одного IP-адреса слишком большой пропускной способностью и быстрый доступ к моим веб-страницам. То есть, проверяя IP-адрес пользователя (я думаю, $_SERVER['REMOTE_ADDR']
?), Проверьте последний визит этого пользователя, вычислите разницу во времени и отбросите страницу, если интервал короткий. Я прав? Если да, то как я могу это сделать, не потребляя слишком много ресурсов и/или времени на сервере? Если есть подход к базе данных, разве это не приведет к слишком большому количеству блокировок?Ограничение количества посещений страниц на основе ip
ответ
Apache mod_bandwidth позволяет контролировать определенный IP-адрес
т.е. BandWidth <domain|ip|all> <rate>
Ваше право, если запрос попадает на php, атакующий уже выиграл. –
Мне нравится ограничивать клиент перед доступом к PHP, но я не хочу просто ограничивать пропускную способность, которую они используют. Предположим, что есть клиент, который реализован как простой многопоточный искатель, и он загружает все страницы моего сайта. Кто я могу это предотвратить? –
Лучший подход зависит от того, кто вы пытаетесь заблокировать. Если это настоящие пользователи, постоянно обновляющие страницу, то (а) вы действительно хотите их заблокировать - они ваши пользователи!? И (б) Вы можете использовать подход на основе сеанса, чтобы избежать ударов БД. Если это боты, то вы не можете полагаться на сеансы (потому что они могут не отправлять заголовки сеансов, или они могут быть в настоящее время, но являются вредоносными ботами, которые обойдутся).
Если это настоящие пользователи, то предполагается, что вы все в порядке с установкой куки сессии, вы хотите что-то вроде этого:
<?php
$min_seconds_between_refreshes = 3;
session_start();
if(array_key_exists('last_access', $_SESSION) && time()-$min_seconds_between_refreshes <= $_SESSION['last_access']) {
// The user has been here at least $min_seconds_between_refreshes seconds ago - block them
exit('You are refreshing too quickly, please wait a few seconds and try again.');
}
// Record now as their last access time
$_SESSION['last_access'] = time();
?>
Если это ботами, то вы, вероятно, реализовать решение на основе базы данных с аналогичной логикой.
На самом деле правильным решением в обоих случаях является, вероятно, кеширующий прокси-сервер перед сервером приложений. Это уменьшит нагрузку на ваш основной сервер приложений и означает, что вам не придется так беспокоиться о таких ситуациях.
Я хочу заблокировать * evil * пользователей/ботов, которые могут использовать всю пропускную способность моего сервера с помощью простого искателя. Как насчет накладных расходов на подход к базе данных? –
Правильно, поэтому подход сеансов не будет работать. DB будет иметь некоторые накладные расходы, но вы, вероятно, попадаете в БД несколько раз за запрос в любом случае? Один дополнительный не будет иметь большого значения. Однако это будет уродливая таблица, и вам придется писать что-то, чтобы периодически очищать старых посетителей. Решение @eugene кажется мне лучше всего. – Howard
Вот код обнаружения наводнения, который использует Memcache. Если пользователь превышает 50 посещений в течение минуты, он блокируется на 300 секунд. Удаленный адрес используется для идентификации клиента.
<?php
$limit = 50;
$seconds = 60;
$block_for_seconds = 300;
$status = 'OK';
$memcache = new Memcache;
$memcache->connect('localhost', 11211);
$ip = $_SERVER['REMOTE_ADDR'];
$r = $memcache->get($ip, array('c', 't'));
$c = 1; // count
$init_time = time();
if($r) {
$s = $r[3]; // status
$c = $r[0]+1;
$init_time = $r[1];
if($s == 'TOO_MANY_REQUESTS') {
$d = time()-$r[1]; // time since block
if($block_for_seconds-$d > 0) { // still blocked
die('Flood detected!! You are going to wait '.($block_for_seconds-$d).' and try again.');
} else { // block is over
$status = 'OK';
$init_time = time();
$c = 0;
}
}
$new_time = time();
if($c > $limit) { // check if happened within a minute
$time_elapsed = $new_time - $init_time;
if($time_elapsed < $seconds) {
$status = 'TOO_MANY_REQUESTS';
}
print "time elapsed: $time_elapsed, count:$c";
$c = 0;
$init_time = time();
}
}
print_r($r);
$memcache->set($ip, array($c, $init_time, $new_time, $status));
?>
- 1. Статистика посещений страниц
- 2. Ограничение доступа MVC на основе IP
- 3. Ограничение количества страниц в поисковом списке
- 4. Ограничение ввода данных на основе количества экземпляров в таблице
- 5. Доктрина разбиения на страницы - ограничение количества отображаемых страниц?
- 6. Python - подсчет количества посещений пользователем
- 7. Количество посещений страниц или Google Analytics?
- 8. Ограничение скорости Instagram на IP?
- 9. Счетчик посещений, основанный на количестве просмотров для динамических страниц
- 10. Изменение количества страниц в getCount FragmentStatePagerAdapter's getCount() на основе настроек
- 11. Расчет, чтобы получить кол-во страниц на основе количества элементов
- 12. Проблема с обнаружением количества страниц на основе итоговых результатов запроса
- 13. ngRepeat: ограничение на основе общей длины символа вместо количества элементов
- 14. Ограничение количества записей, возвращаемых на основе элемента управления формой
- 15. Ограничение количества представлений форм Gravity Forms на основе Datepicker
- 16. заданного количества страниц на GridView
- 17. Счетчик посещений для страниц в Django
- 18. Посещений google analytics больше, чем просмотров страниц
- 19. Количество посещений веб-страниц в laravel/php
- 20. Ограничение количества запросов на сервлет
- 21. Ограничение количества устройств на рельсах
- 22. Ограничение количества кликов на кнопке
- 23. Ограничение доступа к Rails-приложениям на основе IP-адреса
- 24. Ограничение количества строк на веб-странице
- 25. Ограничение количества подключений в Node.js
- 26. Задайте количество страниц на динамических страницах и поддерживайте количество посещений посещений в базе данных
- 27. Загрузка на основе приложений на основе страниц
- 28. Верблюд http Servlet IP-ограничение
- 29. Ограничение количества потоков в python
- 30. Лучшая техника для отслеживания количества посещений веб-страниц и обнаружения некоторых злоупотреблений
Если один пользователь действительно хочет атаковать ваш сайт таким образом, простой IP-блок PHP не остановит их. Тем более, что запрос уже находится в PHP и все равно использует ресурсы. – animuson
Ваш недостающий самый важный материал, это ваш сервер, например VPS, выделенный или у вас есть доступ к брандмауэру и/или вы можете apt-get пакеты? или просто управляемый общий хостинг –
Сервер посвящен. –