我希望能得到一些帮助。 我有一个完整的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,time,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分钟前创建的行(INTERVAL 10 MINUTE)。
我最初遇到过以下问题:
警告:无法修改标头信息 - 已发送的标头 (输出从第x行的xxxxx开始
Warning: Cannot modify header information - headers already sent by error
幸运的是,在上面的堆栈溢出帖子的帮助下,我删除了所有空格并放在文档的开头。这解决了问题
这不是万无一失的,但它会限制对指定时间内放置的任何页面的访问,并且易于实现 - 希望此帮助
答案 0 :(得分:0)
删除echo
之前的header()
语句,它应如下所示:
$valid=0; header ("Location: https://example.com/please-wait-10-mins.php");
注意:您的脚本将在用户重定向后继续执行,因此exit;
可能值得让break;
停止脚本死亡而不是HttpInterceptor
,除非您以后以受控方式处理此问题,或者您只是不在乎