【问题标题】:* Working Restrict website access by IP PHP script has stopped working* 工作 通过 IP 限制网站访问 PHP 脚本已停止工作
【发布时间】:2018-01-25 18:56:54
【问题描述】:

我希望我能得到一些帮助。 我有一个完整的 PHP 脚本(如下),它允许每 10 分钟访问一个特定的网页。

$ipLog='ipLogFile.txt'; 
$timeout='1'; 

$register_globals = (bool) ini_get('register_gobals');
if ($register_globals) $vis_ip = getenv('REMOTE_ADDR');
else $vis_ip = $_SERVER['REMOTE_ADDR'];

function recordData($vis_ip,$ipLog)
{ 
    $log=fopen("$ipLog", "a+"); 
    fputs ($log,$vis_ip."][".time()."\n"); 
    fclose($log); 
} 
function checkLog($vis_ip,$ipLog,$timeout) 
{
    global $valid; $ip=$vis_ip;
    $data=file("$ipLog"); $now=time();

    foreach ($data as $record) 
    {
        $subdata=explode("][",$record);
        if ($now < ($subdata[1]+600*$timeout) && $ip == $subdata[0]) 
        {
            $valid=0; echo header ("Location: https://example.com/please-wait-10-mins.php");
            break;
        }
    }
} 
checkLog($vis_ip,$ipLog,$timeout);
if ($valid!="0") recordData($vis_ip,$ipLog); 

它将用户 IP 和当前时间戳写入文本文件,并在每次访问时检查文本文件。如果当前用户IP有记录的时间戳小于10分钟重定向到另一个页面

使用php报错:

error_reporting(E_ALL); ini_set('display_errors', 1);

我现在看到以下错误:

  • 注意:未定义的偏移量:1 英寸 /home/sites/3a/2/2a40******/public_html/folder/file.php 第 44 行

    注意:未定义的偏移量:1 英寸 /home/sites/3a/2/2a40******/public_html/folder/file.php 第 44 行

    注意:未定义的偏移量:1 英寸 /home/sites/3a/2/2a40******/public_html/folder/file.php 第 44 行

指向:

if ($now < ($subdata[1]+600*$timeout) && $ip == $subdata[0])

发生了什么变化?

自从我的网络托管服务提供商升级了我的平台后,这个问题和其他问题就开始了

除了一些小问题之外,主要的变化是 PHP 版本到 PHP 版本:5.3.28 到最新版本!这完全破坏了网站。我能够将其降级为 PHP 版本:5.3.29,但 PHP 脚本保护页面现在无法正常工作

我使用标准平台托管的其他网站使用 PHP 版本:5.3.28 - 该脚本现在也无法运行

这个脚本多年来一直完美运行,现在根本无法运行,我无法指出原因

我希望一个简单的 sytax 更改可以解决问题,但由于它随机停止工作,我认为这可能是托管服务提供商 php ini 文件的更改或其他政策更改

任何帮助将不胜感激

更新

变化

$subdata[1]

$subdata[0]

解决了错误,但仍然没有阻止对页面的访问

已解决

我不得不放弃这个脚本 - 我不知道它为什么停止工作

对于那些感兴趣的人,我现在使用以下代码来阻止 IP 地址 10 分钟并将它们重定向到另一个页面。 10 分钟后,他们再次被授予访问权限

创建一个包含 3 个字段 id、时间、IP 的 sql 数据库,在本例中是它的 称为 ip-block - 注意:记住 ipv6 地址的长度

解决方案

在这种情况下首先使用用户 IP 生成一个变量 $vis_ip :

$register_globals = (bool) ini_get('register_gobals');
if ($register_globals) $vis_ip = getenv('REMOTE_ADDR');
else $vis_ip = $_SERVER['REMOTE_ADDR'];

然后连接到您的数据库并运行以下命令:

mysql_query("DELETE FROM ip-list WHERE time < (NOW() - INTERVAL 10 MINUTE)");

$result = mysql_query("SELECT ip FROM ip-list WHERE ip = '$vis_ip'");

if(mysql_num_rows($result)==1){
   header("Location: ../folder/file.php");
} 
else {
  $result = mysql_query("INSERT INTO ipblock (ip, time) VALUES ('$vis_ip', NOW())");
} 

换句话说,如果您的 IP 在列表中,您就不会进来

这使用 SQL 数据库来存储访问者的 IP 地址并删除超过 10 分钟前创建的行(间隔 10 分钟)。

我最初遇到以下问题:

警告:无法修改标头信息 - 标头已由 (输出从第 x 行的 xxxxx 开始

Warning: Cannot modify header information - headers already sent by error

幸运的是,在上面的堆栈溢出帖子的帮助下,我删除了所有空白并放置在文档的开头。这解决了问题

这不是万无一失的,但它会在指定的时间内限制对任何页面的访问,并且易于实施 - 希望对您有所帮助

【问题讨论】:

  • 你为什么使用$subdata[1]
  • 因为你爆炸了数组所以每个数组只有1个值你需要尝试$subdata[0]
  • 您好,使用 $subdata[0] 可以消除错误,但文件脚本仍然无法正常工作 - 谢谢
  • 这个问题已经解决了请看问题

标签: php ip limit restrict minute


【解决方案1】:

删除header()之前的echo语句,它应该是这样的:
$valid=0; header ("Location: https://example.com/please-wait-10-mins.php");

注意:您的脚本将在用户被重定向后继续执行,因此可能值得一个 exit; 来阻止脚本死在它的轨道上而不是 break; 除非您稍后以受控方式处理,否则您根本不在乎

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2010-12-12
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多