Ограничение http запросов от php / apache или .htaccess? - PullRequest
1 голос
/ 10 января 2011

В последнее время мой сайт получает сканирование на уязвимости, за которое я не отвечаю.Я пытаюсь заблокировать любой IP, который запрашивает больше разумного количества страниц.Я на самом деле не уверен в количестве, может быть, 4-5 запросов и блокирую их.

Я видел, как это делается с веб-серверами световой скорости, но у меня есть Apache.Как я могу ограничить запросы PHP для своих страниц, чтобы, если пользователь превысил ограничение, он был заблокирован на моем сайте на 30 минут?(Я действительно не уверен, что такое хорошее количество. Что-то такое, что реальный пользователь не будет заблокирован.)

Ответы [ 3 ]

1 голос
/ 10 января 2011

Я использую это для блокировки пользовательских IP-адресов, просто вставьте в скрипт:

    <?php
$deny = array("111.111.111", "222.222.222", "333.333.333");
if (in_array ($_SERVER['REMOTE_ADDR'], $deny)) {
   header("location: http://www.mywarningpage_or_anywhereyouwouldlike.com/");
   exit();
} ?>

, чтобы автоматически заблокировать кого-то, вам нужно будет создать историю ip со временем.

<?php
$ip = $_SERVER['REMOTE_ADDR'];
$time = time();
$myFile = "ip_log.txt";
$fh = fopen($myFile, 'a') or die("can't open file");
$stringData = $ip.":"$time."\n";
fwrite($fh, $stringData);
fclose($fh);

чтобы теперь автоматизировать, пусть первый скрипт получит массив

$ip = $_SERVER['REMOTE_ADDR'];
$ips = file("ip_log.txt")
$count = count($ips);
for ($i=0;$i<=$count;$i++){
if (strpos($ips[$i],$ip)==true){
$teile = explode(" ", $pizza);
$ip_h[] = $teile[0]; // Teil1
$time_h[] = $teile[1]; // Teil2
}

//now you have arrays of the actual users ip with times.
// now set a timeinterval of amount of requests you define as "spam"
// and check with if for through array to deny similar like first script

написано мной без тестирования

1 голос
/ 10 января 2011

Важной особенностью такого решения является то, что фактическая «блокировка» является очень недорогой с точки зрения ресурсов.Также важно правильно распознать злоумышленников и не забанить кого-то случайно, но также не будьте слишком открыты, так что вы уже потратили много ресурсов, прежде чем блокировать кого-либо.

Однако вы не первый, кто испытывает этопроблема.

Существует отличный модуль apache, называемый mod_evasive, который настроен именно на это.

Однажды я применил очень простую технику на сервере (потому что она работала лучше с этим приложением partuclar.) с потоком, подобным следующему:

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

Если так, то адрес ip записывается в журнал заданий, где cronjob поднял его и добавил фильтр, используя iptables, чтобы пакеты из этого ip просто отбрасывались.

Таким образом, они даже не достигаютвеб-сервер и затраченные ресурсы минимальны.

Один раз в день добавленные правила очищаютсяд.

0 голосов
/ 10 января 2011

Я думаю, что мы все знаем, что будет дальше (учитывая, что каждый файл / изображение и т. Д. - это один запрос).

Чтобы предложить альтернативу, почему бы просто не заблокировать один или несколько IP-адресов, вызывающих проблемы, - вы можете предположительно получить соответствующие IP-адреса из журналов трафика, и добавить «Deny from xxx.xxx.xxx.xxx» тривиально стиль IP-адрес блока в вашей конфигурации httpd. (Кроме того, в отличие от подхода, основанного на PHP, это также относится к изображениям и т. Д.)

В противном случае существует риск блокирования законного веб-трафика, пауков Google и т. Д.

...