我有一个外部IP列表,我想在我的网站上阻止(或者,更好的是,重定向)。我首先采用.htaccess
方法但后来意识到使用PHP可能更容易。但现在我不确定......似乎PHP和MySQL一起是最好的选择。
我在MySQL中有一个包含CIDR块的表。我一直在努力将用户的IP与表格进行比较。
什么是最好的方法?
我正在考虑以某种方式检查被阻止的IP,像这样(PHP和伪代码):
$user_ip = $_SERVER['REMOTE_ADDR'];
loop through returned rows {
if ($user_ip in returned row from MySQL table) {
forward to another domain
}
else // do something else...
}
但我正在处理知识产权组;不是单一的IP。我一直在使用一些CIDR脚本和ip2long来反汇编和解析组。但事实证明这很困难。
根据评论的建议,如果我将IP存储在数据库中,我可以直接比较。但我正在处理的整个区块都是巨大的,我不确定这样做。我将在比较中处理数百万的IP ......
有关如何最好地完成此任务的任何建议?
答案 0 :(得分:0)
我最终能够解决这个问题。这就是我做的......
首先,我创建了一个脚本,将我庞大的IP CIDR块列表注入MySQL。
然后,我编写了一个脚本,首先查询数据库,获取IP块, 将它们收集到一个数组中,然后使用此处找到的函数(Find whether a given IP exists in CIDR or not)将用户的IP与数据库中的CIDR块进行比较。
// initialize array
$cidr_block = array();
// query mysql database for all id and ip_cidr values
$query = "SELECT id, ip_cidr FROM ip_blocks";
// use mysqli class to query database
if ($result = $mysqli -> query($query)) {
// build array for testing with IP_vs_CIDR class
while ($row = $result -> fetch_assoc()) {
$cidr_block[] = $row['ip_cidr'];
}
// run IP_vs_CIDR on user ip address and cidr block array from database
$cidr_result = $ip_vs_cidr -> test_user_ip($user_ip, $cidr_block);
// test ip against the array values and send elswhere if bad
if ($cidr_result) {
header('Location: http://www.google.com/');
}
// free up result set
$result -> close();
}
然后,我根据这个结果重定向。似乎工作得很好,因为用户IP的固定IP进行了多次测试(例如,$user_ip = '75.150.41.15')
正确测试并按预期重定向。我测试了黑名单中的IP而不是两种基础。
感谢您的评论 - 他们很有帮助。