2017-08-17 64 views
2

我希望能得到一些帮助。 我有一个完整的PHP脚本(如下),允许每10分钟访问特定的网页。*工作通过IP限制网站访问PHP脚本已停止工作

$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错误报告:

​​

我现在看到了以下错误:

  • 注意:未定义偏移量:1在 /home/sites/3a/2/2a40******/public_html/folder/file.php 在线44

    注意:Undefine偏移d:1 /home/sites/3a/2/2a40******/public_html/folder/file.php 第44行

    注意:未定义偏移:1 /家/位点第44行

指向/3a/2/2a40******/public_html/folder/file.php :

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

发生了什么变化?因为我的网站托管服务提供商升级我的平台

这再加上其他的问题已经开始除了一些小问题,改变了主要的事情是PHP版本PHP版本:28年3月5日到最新版本!这完全打破了网站。我能够降级到PHP版本:5.3.29,但PHP脚本保护页面现在不工作

我用标准平台托管的其他网站使用PHP版本:5.3。28 - 在该脚本现在也不工作

此脚本多年的完美无缺,现在都没有工作,我不能针点为什么

我希望一个简单的语法时才改变可能会解决的问题,但它随机停止工作IM以为它可能已在托管服务提供商的PHP ini文件或者其他政策改变

发生变化的任何帮助,将不胜感激

更新

更改

$subdata[1] 

$subdata[0] 

解决了错误,但它仍然无法阻止访问的页面

解决

我不得不放弃这个剧本 - 我找不到为什么停止工作

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

创建3个字段ID,时间,IP,在这种情况下,其 称为IP块SQL数据库 - 注:记住IPv6地址的长度

解决方案

首先产生在这种情况下,$ vis_ip用户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分钟前创建的行(INTERVAL 10 MINUTE)。

我最初有问题有:

警告:不能更改头信息 - 已经 发送头(输出开始为XXXXX线X

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

幸好有帮助从上面的堆栈溢出文章中,我删除了所有的空白并放置在文档的开头。这解决了这个问题

这是骗不了的证据,但它会限制访问它被放置在指定的时间长度的页面,很容易实现 - 希望这有助于

+0

为什么你使用'$子数据[1]'? – Nawin

+0

因为你爆炸的阵列,每个阵列只值1你需要尝试'$子数据[0]' – Nawin

+0

嗨,使用$子数据[0]删除错误,但该文件的脚本仍然不起作用 - 谢谢你 –

回答

0

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

注:脚本将继续执行用户被重定向后,所以它可能是值得的exit;停止脚本死在它的轨道,而不是break;除非哟ü处理这个以可控的方式以后,或者你根本不关心

+0

我已经解决了上述问题谢谢 –