PHP如何禁止异常设备的非法访问网站

admin 2024-06-15 698 阅读 0评论

一、cookie限制访问

为什么要提cookie限制访问呢?我可以只允许支持cookie的用户进行访问,大部分用户如果通过正常浏览器进行访问,基本都是支持cookie的,除非用户关闭了浏览器的cookie功能。我个人理解很多机器访问是不会像浏览器一样支持cookie的,从而达到限制异常访问的目的,不过该功能可能会对部分搜索引擎蜘蛛的抓取造成影响,所以我们需要提前进行甄别,我在前面的文章介绍过PHP如何识别蜘蛛,所以这里就不过多介绍了。同时访问者可以通过模拟真实用户传递cookie参数而对我们的判断进行欺骗,甚至他可能本身就是利用浏览器来进行访问的,比如部分采集工具就是调用浏览器来进行内容抓取的。显然该功能只能屏蔽部分异常访问,不过我们可以增加cookie的模拟难度来增加识别准确度。


function
checkcookie($str=null) {
   $return = false;
   if($str == 0 || $str == null) {
       $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
       $cookiename = '';
       $cookievalue = '';
       for ($i = 0; $i < 8; $i++) {
           $cookiename .= $characters[mt_rand(0, strlen($characters) - 1)];
       }
       for ($i = 0; $i < 16; $i++) {
           $cookievalue .= $characters[mt_rand(0, strlen($characters) - 1)];
       }
       setCookie($cookiename, $cookievalue, 5 ,'/', '', true, true);
   }
   if (isset($_COOKIE["$cookiename"]) && $cookievalue == $_COOKIE["$cookiename"]) {
       $return = true;
   }
   return $return;
}

该代码设置了一个随机的cookie 8位字符的键名和一个随机16位字符的对应值。我们再通过获取该cookie的值来对用户浏览器是否支持cookie进行判断。如果支持则checkcookie()返回true,否则返回false。虽然该方法并不是十分准确,但是也可以作为我们的一个判断依据。使用方法:


if
(checkcookie() == false) {
   die('您的浏览器不支持cookie');
}

二、$_SERVER['HTTP_ACCEPT']参数判断


if
(strpos($_SERVER['HTTP_ACCEPT'], 'text/html') !== false) {
   //可能是真实浏览器
}else{
   die('坚决杜绝一切非正常访问');
}

一般来说,如果浏览器不支持text/html,基本可以判断为非真实用户进行访问!

三、请求时间和频率判断

这里可以使用session来储存用户的访问时间,对两次访问的时间进行对比,如果间隔时间小于1秒,也可以进本判断为非正常访问。那么代码应该怎么写呢?


session_start()
; // 启动会话
//先判断用户是不是访问过,如果没有访问过, 设置会话变量
if (!isset($_SESSION['time'])) {
   $_SESSION['time'] = time();
} else {
   $usertime = time - $_SESSION['time'];//计算两次的访问时间差
   if ($usertime <= 1) {//如果时间差小于1秒,则退出脚本或者禁止访问
       die('禁止频繁访问');
   }
}

四、限制IP访问

如果我已知一些IP属于非正常访问,就像我上面截图中的访问行为,我百分百确定它是非正常访问!那么我可以通过判断IP进行访问限制:


$ips
= ['127.0.00.1', '192.168.1.1'];//限制访问的IP
foreach ($ips as $ip) {
   if ($ip == $_SERVER['REMOTE_ADDR']) {
       die('IP已被禁止访问');
   }
}

五、限制UA访问

根据一些模拟访问的UA头部信息特征进行限制,这里我们可以简单举个例子。下图中可以看出右侧的UA头部信息,然后分析它在网站上的操作,访问了一些不存在的页面,截图中看到返回的状态码是503,这是我根据IP和UA信息判断为非正常访问,特意反馈到浏览器的。


$ua
= $_SERVER['HTTP_USER_AGENT'];
//限制UA信息为空的访问
if ($ua == null) {
   die('访问异常,页面禁止加载')
}
//限制带有特定UA特征的访问
$array = ['Dalvik/2.1.0', 'Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1)'];
foreach ($array as $v) {
   if (strpos($ua, $v) > 0 || $ua == $v) {//判断用户的UA头部信息是否包含禁止的UA特征或者等于禁止的UA
       die('访问异常,页面禁止加载');
   }
}

六、结尾

以上介绍的都是一些禁止异常访问的思路,虽然不能准却识别异常访问,但是大部分简单的模拟访问、机器访问可以通过上面的这些方法进行识别并加以限制,以提高网站被暴力破解、异常请求所带来的一些安全威胁。如果你想要提供识别异常访问的准确度,你可以使用专业的第三方库来进行识别。本文中介绍的die()函数用于停止脚本继续执行,当然在禁止脚本运行之前,我们可以自定义一些状态码告诉浏览器我们想让它理解的一些信息。比如:


//
设置自定义状态码
http_response_code(403);
// 发送自定义头部信息
header('X-Custom-Status: Forbidden');
// 结束脚本执行
exit('对不起,您无权访问该资源。');


案例代码中发送了一个404状态,你也可以设置其他状态码,比如500,400,300等。

喜欢就支持以下吧
点赞 0

发表评论

快捷回复: 表情:
aoman baiyan bishi bizui cahan ciya dabing daku deyi doge fadai fanu fendou ganga guzhang haixiu hanxiao zuohengheng zhuakuang zhouma zhemo zhayanjian zaijian yun youhengheng yiwen yinxian xu xieyanxiao xiaoku xiaojiujie xia wunai wozuimei weixiao weiqu tuosai tu touxiao tiaopi shui se saorao qiudale qinqin qiaoda piezui penxue nanguo liulei liuhan lenghan leiben kun kuaikule ku koubi kelian keai jingya jingxi jingkong jie huaixiao haqian aini OK qiang quantou shengli woshou gouyin baoquan aixin bangbangtang xiaoyanger xigua hexie pijiu lanqiu juhua hecai haobang caidao baojin chi dan kulou shuai shouqiang yangtuo youling
提交
评论列表 (有 0 条评论, 698人围观)

最近发表

热门文章

最新留言

热门推荐

标签列表