【问题标题】:php blocking visitors based on text list of ipsphp根据ips的文本列表阻止访问者
【发布时间】:2018-06-07 09:52:24
【问题描述】:

我正在尝试编写一个简单的 PHP 通用块包含代码,该代码将读取文本文件以填充 IP 数组,然后使用该数组比较访问者 IP 以确定它是否应该结束页面显示, 阻止该网页或网站。此代码还将日志行放入 403 文件,然后发送失败者(用户)查看它,结束他们对该站点的访问。该行将他们的信息附加到开放式 403 文件的末尾。

包含可以放在您不希望该 IP 列表看到的任何位置。问题是我是一个无可救药的黑客,对这些循环和语法没有很好的掌握。你能帮我解决这个问题吗?似乎可以读取 IP 列表,但是 while 循环似乎是错误的。我可以进一步简化这一点。但我不确定问题是什么..我选择的变量名...也许吧。

<? 
$IP = $_SERVER['REMOTE_ADDR'];


        $link_file = "bannedips.dat";
        $lines = file($link_file);

        foreach($lines as $line){
            if(!empty($line)){
                $line_array = explode(',', $line);
                $bannedip = trim(trim(strip_tags($line_array[0]), "\x00..\x1F"));
            }
        }



while $bannedip if ((substr($IP,0,10) == $bannedip) {
$line = date('Y-m-d H:i:s') . " - <b>$IP</b><br>\n";

file_put_contents('403.shtml', $line . PHP_EOL, FILE_APPEND);
header('Location: 403.shtml');
die();
}
?>

【问题讨论】:

  • 有任何理由在 PHP 中这样做,而不仅仅是在您的防火墙或 Web 服务器设置中?
  • 您不需要放入while循环,您可以简单地将这些ips从文件中放入数组中,然后查找访问者ip是否存在于数组中......简单!!!!跨度>
  • 我有另一个页面用于创建 IP 列表,因为我从这些 IP 中删除了放置的内容。这就是我想看到的,在数组中找到 ip 的代码。我们是在谈论使用像'if(in_array')这样简单的东西吗

标签: php while-loop ip-blocking


【解决方案1】:

您可以从文件中构建一个被禁止 IP 的数组(您只是覆盖了代码中的最后一个,使用 $bannedip[] 将其添加到列表中),然后使用 in_array() 检查用户 IP反对这份名单...

$link_file = "bannedips.dat";
$lines = file($link_file);
$bannedip = [];   // Create start array
foreach($lines as $line){
    if(!empty($line)){
        $line_array = explode(',', $line);
        $bannedip[] = trim(trim(strip_tags($line_array[0]), "\x00..\x1F"));
    }
}
if(in_array($IP, $bannedip )) {
    $line = date('Y-m-d H:i:s') . " - <b>$IP</b><br>\n";
    file_put_contents('403.shtml', $line . PHP_EOL, FILE_APPEND);
    header('Location: 403.shtml');
    die();
}

处理输入文件可能有一种更简洁的方式,但不知道格式很难说,所以我保留了你的代码。

更新:

如果你禁止的 IP 文件只是一个 IP 地址列表,你可以将 load 和 foreach 替换为...

$bannedip = file($link_file, FILE_IGNORE_NEW_LINES);
$bannedip = array_filter($bannedip);

更新 2: 正如您似乎已经自己解决了这个问题,但发布了您拥有的实际文件格式的示例,我想我会添加它是如何完成的......

$IP= "31.130.4.241";
$link_file = "bannedips.dat";
$bannedip = file($link_file, FILE_IGNORE_NEW_LINES);
$bannedip = array_map("str_getcsv", $bannedip);
$bannedip = array_column($bannedip, null, 0);
if(isset($bannedip[$IP])) {
    $line = date('Y-m-d H:i:s') . " - <b>{$bannedip[$IP][0]}</b> - {$bannedip[$IP][1]} - {$bannedip[$IP][2]}<br>\n";
    file_put_contents('403.shtml', $line . PHP_EOL, FILE_APPEND);
    header('Location: 403.shtml');
    die();
}

【讨论】:

  • 看起来不错 - 数据格式只是 IP 地址列表。
  • 您可以尝试添加的代码来简化加载部分,因此假设它只是每行文件的一个 IP,它会快很多。
  • 这很奇怪,但是 If 没有在数组中找到 IP,也没有触发对 403 的写入或重定向。我会尝试最新的建议,也许阵列没有正确构建。不 - 那也没有帮助......我已经将我自己的 IP 放在列表中,并从我的开发机器上进行测试。它应该拒绝访问,但不。这应该作为一个 PHP 包含,任何地方,任何人,基于 IP 的文本文件。但我还在挣扎。我把它作为我标题中的最后一件事。也许应该是第一个?
  • 它不会让我以我拥有的方式发布它。每行一个 IP。
  • 顺便说一句,非常感谢您的意见...!
【解决方案2】:

最初的目标是编写一小段 INCLUDE 代码来解析文本文件、找到匹配的 IP、记录信息并将垃圾邮件混蛋丢到 403 页面。这样,违规用户可以访问任何页面,除了包含这段脚本的页面。非常有选择性的屏蔽。

这是我的最终代码:

  <? 
    $IP = $_SERVER['REMOTE_ADDR'];
    echo $IP;
    $link_file = "bannedips.dat";
    $lines = file($link_file);

            foreach($lines as $line){
                if(!empty($line)){
                    $line_array = explode(',', $line);
                    $inputip = trim(trim(strip_tags($line_array[0]), "\x00..\x1F"));
                    $website = trim(trim(strip_tags($line_array[1]), "\x00..\x1F"));
                    $email = trim(trim(strip_tags($line_array[2]), "\x00..\x1F"));

                    if($IP == $inputip) {
                        $line = date('Y-m-d H:i:s') . " - <b>$inputip</b> - $website - $email<br>\n";
                        file_put_contents('403.shtml', $line . PHP_EOL, FILE_APPEND);
                        header('Location: 403.shtml');
                        die();
                    }
                }
            }
    ?>

数据文件格式如下:

23.105.159.238,penilengorgement.com,randomjerk@spammer.net
31.130.4.240,scamtown.com,spameister@viagraads.com

所以,现在当我禁止 IP(垃圾邮件发送者)时,它会从我的博客中提取他们的信息,并将其放入链接文件中,在那里可以对其进行解析并用于记录屡犯者,并为他们提供尝试进入的替代方案我的网站,向他们提供同行列表。

【讨论】:

    猜你喜欢
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多