我已经设置了一个PHP IP黑名单系统,它运行得非常好。 我现在希望它能够从txt文件中获取原因。
ip_blacklist.txt
1.2.4.5 , No Spamming Allowed
1.2.4.5 , No Spamming Allowed
1.2.4.5 , No Spamming Allowed
现在在PHP中,它将IP与用户使用的IP进行比较,这是完美的。 但如果IP与txt中的IP匹配,它会将您重定向到黑名单页面。 我希望它能显示出将其列入黑名单的原因。
如何使用PHP获取与txt文件中的IP匹配然后将其链接到的原因 $原因吗?
答案 0 :(得分:0)
编辑:编辑包含从文件而不是db获取结果的preg_match方法。此方法将检查用户是否在黑名单中以及获取用户原因。
您可以简单地将用户IP存储在数据库中,并附上原因。然后在运行检查时,如果用户在黑名单中,则在数据库中查询其ip,然后返回并显示原因。
$ip = $_SERVER['REMOTE_ADDR'];
$sql = 'SELECT reason FROM blacklist WHERE ip = "' . $ip . '"';
然后针对您的数据库运行该sql。当然这是一个粗略的想法,并且没有针对sql注入的保护,因此我建议在运行查询之前使用某种形式的excaping并验证$ip
的ip地址格式是否正确。
整个过程将是:
如果您只想通过文件完成所有操作,那么获取文件内容,查找IP和原因以及显示原因会更好。
这可以使用preg_match完成。
$file = file_get_contents('path/to/blacklist/file');
$ip = $_SERVER['REMOTE_ADDR'];
$pattern = '#' . $ip . '\s,\s.*#';
if(preg_match($pattern, $file_contents, $matches)) {
$match = $matches[0];
$explode = explode(',', $match);
$reason = $explode[1];
echo $reason;
}
请注意,这是未经测试的,但我认为它会起作用。
答案 1 :(得分:0)
或者你可以使用爆炸:
$myTextFileLine = "1.2.4.5 , No Spamming Allowed";
$cutted = explode(",", $myTextFileLine);
echo "Ip blacklisted: ".$cutted[0].", reason: ".$cutted[1];
答案 2 :(得分:0)
与上述答案一样,我同意解决此问题的最佳方法是将用户的IP存储在数据库中,但如果您仍需要为其读取文件,则此代码应该可以完成此任务:
<?php
//The file you will read
$file = fopen("ip_blacklist.txt", "r") or exit("Unable to open file!");
//Where we will store each ip as we read it
$ip = "";
$parts;
while(!feof($file))
{
//Split the line and save the parts
$parts = explode(" , ", fgets($file));
$ip = $parts[0];
$reason = $parts[1];
//And here you can compare it to the client's ip
//The first one is the ip read from the file
echo $ip."<br>";
//And this is how you would get the client's ip
echo $_SERVER['REMOTE_ADDR']."<br>";
}
//Close the file
fclose($file);
?>
请注意,获取客户端IP的方式无论如何都不是最好的(因为它可以非常容易地欺骗)。有关详细信息,请阅读How to get Client IP address in PHP?
- 编辑 -
我只是注意到你只是想检查IP,比较它并得到原因。在这种情况下,将while更改为:
while(!feof($file))
{
//Split the line and save the parts
$parts = explode(" , ", fgets($file));
$ip = $parts[0];
if($_SERVER['REMOTE_ADDR'] == $ip)
echo $parts[1];
}