Есть ли более быстрый способ проверки блоков IP с PHP - PullRequest
1 голос
/ 21 марта 2012

Продолжая борьбу за блокировку спамеров из Нигерии, я заблокировал код страны в своем файле htaccess с помощью GeoIP, но некоторым все же удается дозвониться. Чтобы добавить еще один слой, я хочу перебрать следующий список диапазонов IP-адресов из Нигерии и заблокировать их:

41.75.192.0 41.75.207.255
41.138.160.0    41.138.191.255
41.139.64.0 41.139.127.255  
41.155.0.0  41.155.127.255
41.184.0.0  41.184.255.255
41.189.0.0  41.189.31.255
41.190.0.0  41.190.31.255
41.203.64.0 41.203.95.255
41.203.96.0 41.203.127.255
41.204.224.0    41.204.255.255
41.205.160.0    41.205.191.255
41.206.0.0  41.206.31.255
41.206.224.0    41.206.255.255
41.211.192.0    41.211.255.255
41.216.160.0    41.216.175.255
41.217.0.0  41.217.127.255
41.219.128.0    41.219.191.255
41.219.192.0    41.219.255.255
41.220.64.0 41.220.79.255
41.221.112.0    41.221.127.255
41.221.160.0    41.221.175.255
62.173.32.0 62.173.63.255
62.193.160.0    62.193.191.255
80.248.0.0  80.248.15.255
80.250.32.0 80.250.47.255
81.18.32.0  81.18.47.255
82.128.0.0  82.128.127.255
195.166.224.0   195.166.255.255 
196.1.176.0 196.1.191.255
196.29.208.0    196.29.223.255
196.45.48.0 196.45.63.255
196.45.192.0    196.45.255.255  
196.200.0.0 196.200.15.255
196.200.64.0    196.200.79.255
196.200.112.0   196.200.127.255 
196.207.0.0 196.207.15.255
196.220.0.0 196.220.31.255
212.100.64.0    212.100.95.255
217.14.80.0 217.14.95.255
217.117.0.0 217.117.15.255

Используя следующий код для проверки каждого диапазона, существует ли более эффективный метод или способ сделать это?

$range_start = ip2long("41.75.192.0");
$range_end   = ip2long("41.75.207.255");
$ip          = ip2long($_SERVER['REMOTE_ADDR']);
if ($ip >= $range_start && $ip <= $range_end) {
   // blocked
}

Ответы [ 6 ]

2 голосов
/ 22 марта 2012

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

order allow,deny
deny from 41.75.192.0
deny from 41.75.207.255

...

deny from 217.117.15.255
allow from all

Если Apache полностью их исключит, вы спасете вас.немало неприятностей.

1 голос
/ 22 марта 2012

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

$ips = array(
            array(ip2long('41.75.192.0'), ip2long('41.75.207.255')),
            array(ip2long('41.138.160.0'), ip2long('41.138.191.255')),
            array(ip2long('41.139.64.0'), ip2long('41.139.127.255'))
);

$ip = '41.138.160.1';

function binary_search(array $a, $ip) {
    $low = 0; 
    $high = count($a) - 1;

    while ($low <= $high) {
        $mid = ($low + $high) / 2;
        if ($a[$mid][0] > $ip) {
            $high = $mid - 1;
        } else if ($a[$mid][1] < $ip) {
            $low = $mid + 1;
        } else {
                return true;
        }
    }           
    return false;
}

var_dump(binary_search($ips, ip2long($ip)));

Используя бинарный поиск по массиву из 40 элементов, вы должны сделать не более 6 итераций. Используя линейный поиск - 40.

1 голос
/ 22 марта 2012

С .htaccess проще

order allow,deny
deny from 41.75.192.
deny from 41.75.193.
...
deny from 41.75.207.
allow from all

Php решение:

$range_start = 192;
$range_end = 207;
$ip = preg_match('/41\.75\.(\d+)\.(\d+)/', $_SERVER['REMOTE_ADDR'], $m);
if(intval($m[1]) >= $range_start && intval($m[1]) <= $range_end) {
    //blocked
}
0 голосов
/ 09 января 2017

Способ более эффективен, чем любая версия языка программирования или apache.Вы можете сделать системный вызов, чтобы добавить или удалить записи внутри php.

создать набор

ipset create test hash:net

заполнить набор!

ipset add test 212.100.64.0/19
ipset add test 41.211.192.0/18
ipset add test 196.200.112.0/20
ipset add test 41.220.64.0/20
ipset add test 41.206.0.0/19
ipset add test 41.203.64.0/19
ipset add test 62.173.32.0/19
ipset add test 62.193.160.0/19
ipset add test 41.138.160.0/19
ipset add test 196.200.0.0/20
ipset add test 217.14.80.0/20
ipset add test 80.250.32.0/20
ipset add test 195.166.224.0/19
ipset add test 41.221.112.0/20
ipset add test 41.216.160.0/20
ipset add test 196.200.64.0/20
ipset add test 41.139.64.0/18
ipset add test 41.206.224.0/19
ipset add test 41.221.160.0/20
ipset add test 196.45.192.0/18
ipset add test 41.217.0.0/17
ipset add test 82.128.0.0/17
ipset add test 41.203.96.0/19
ipset add test 41.184.0.0/16
ipset add test 41.205.160.0/19
ipset add test 41.219.128.0/18
ipset add test 41.204.224.0/19
ipset add test 217.117.0.0/20
ipset add test 196.220.0.0/19
ipset add test 41.155.0.0/17
ipset add test 196.1.176.0/20
ipset add test 41.190.0.0/19
ipset add test 80.248.0.0/20
ipset add test 196.29.208.0/20
ipset add test 41.189.0.0/19
ipset add test 41.75.192.0/20
ipset add test 81.18.32.0/20
ipset add test 41.219.192.0/18
ipset add test 196.45.48.0/20
ipset add test 196.207.0.0/20

Использовать набор

iptables -I INPUT 1 -m set --match-set test src -j DROP
iptables -I FORWARD 1 -m set --match-set test src -j DROP

Сохранить набор

ipset save -f /somewhere/something.txt

Загрузить набор

ipset load -f /somewhere/something.txt

Сохранить iptables

iptables-save >/somewhere/something.txt

Загрузить iptables

iptables-restore < /somewhere/something.txt

Cron или systemd для автоматизации процесса сохранения / загрузки.

0 голосов
/ 11 апреля 2012

Существуют законные пользователи, которые пытаются получить доступ к вашему сайту с ips, которые известны как спам.Например, сеть Tor позволяет вам направлять трафик через 3-4 ips, чтобы защитить вашу конфиденциальность.Большинство пользователей используют это в дурных целях, поэтому большинство ips там перечислены в списках спама.

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

Я использую для этого Spambusted и Botscout .У них обоих есть пример кода и плагины для основного программного обеспечения с открытым исходным кодом.

0 голосов
/ 22 марта 2012

Выполнение 120 (3x40) вызовов на ip2long и 40 ifs вряд ли будет узким местом для любого сервера. Ответ на ваш вопрос: нет, и вы не должны беспокоиться об этом.

Скорее всего, у вас больше проблем с производительностью на остальной части вашего сайта.

...