有没有更快的方法来检查PHP块的IP

时间:2012-03-21 19:59:22

标签: php ip spam-prevention

随着我继续阻止来自尼日利亚的垃圾邮件发送者,我已经使用GeoIP阻止了我的htaccess文件中的国家/地区代码,但有些人仍然设法通过。要添加另一个图层,我想迭代来自尼日利亚的以下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 个答案:

答案 0 :(得分:2)

如果您有权访问.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 :(得分:1)

.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
}

答案 2 :(得分:1)

以下是二分搜索的示例,请记住$ ips中的元素必须进行排序。如果你在生产中使用它,用$ ips替换整数值中的ip2long('..') - 你不需要每次都计算它们。

$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。

答案 3 :(得分:0)

对ip2long进行120(3x40)次调用,40次ifs几乎不会成为任何服务器的瓶颈。你的问题的答案是:不,你不应该为此烦恼。

您的网站其他部分更有可能出现更大的性能问题。

答案 4 :(得分:0)

有合法用户试图通过垃圾邮件来访问您的网站。例如,Tor网络允许您通过3-4 ips引导您的流量以保护您的隐私。大多数用户将此用于恶意目的,因此垃圾邮件列表中列出了大多数ips。

最有效的方法是在用户尝试在您的网站上执行需要身份验证的操作时,针对其中一个垃圾数据库检查用户的信息。检查不仅包括IP,还包括用户名和电子邮件。我的网站上有垃圾邮件问题,使用其中一个链接后,它显着减少了。现在几乎降到零了。

我用于此SpambustedBotscout。他们都有主要开源软件的示例代码和插件。

答案 5 :(得分:0)

比任何编程语言版本或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自动执行保存/加载过程。