关于PHP的$_SERVER{'HTTP_USER_AGENT'}匹配不到Mozilla的奇怪bug

今天在玩耍PHP,根据官方手册http://php.net/manual/zh/tutorial.useful.php,编写了一个脚本

具体就是根据$_SERVER{'HTTP_USER_AGENT'}的返回值,判断浏览器的种类,输出相应的信息,首先来看看这个变量在我的QQ浏览器上反悔了什么

<?php
header("Content-Type: text/html; charset=utf-8");
echo '<p>Hello World</p>';
echo '<p>';
echo $_SERVER{'HTTP_USER_AGENT'};
echo '</p>';

当我看见Mozilla,我的记忆中那好像和火狐浏览器有关,此刻我并没有在意为什么我的QQ浏览器会显示Mozilla,学着官网写了一段判断浏览器类型的代码

if(strpos($_SERVER{'HTTP_USER_AGENT'}, 'Mozilla') != FALSE) {
    echo '正在使用火狐浏览器';
}

然后重新运行,发现语句并没有执行成功,经过我的各种尝试,$_SERVER{'HTTP_USER_AGENT'}的一长串返回值中,任何字符串都是可以成功匹配的,比如QQBrowser、Chrome、Safari

if(strpos($_SERVER{'HTTP_USER_AGENT'}, 'QQ') != FALSE) {
    echo '正在使用QQ浏览器';
}
if(strpos($_SERVER{'HTTP_USER_AGENT'}, 'Safari') != FALSE) {
    echo '正在使用Safari浏览器';
}
if(strpos($_SERVER{'HTTP_USER_AGENT'}, 'Chrome') != FALSE) {
    echo '正在使用谷歌浏览器';
}

甚至“ozilla”都是可以匹配到的,唯有“Mozilla”这个单词匹配不到,在网上进行了一番搜索都没有找到答案,我甚至还看完了浏览器为什么user agent信息都带着Mozilla的原因

https://www.zhihu.com/question/19553117

扯远了,扯回来,再次尝试debug

写了一个echo语句,看一下strpos($_SERVER{'HTTP_USER_AGENT'}, 'Mozilla')到底返回什么

echo strpos($_SERVER{'HTTP_USER_AGENT'}, 'Mozilla');

返回值是0,表示子字符串在0位置出现,一切都没有问题

突然电光火石之间我想起了一个关于JavaScript三位一体的传说

 所以有没有可能在PHP里面(0 == False)呢,实验了一下

if (0 == FALSE) {
    echo 'WTF';
}

行吧 

这段代码是一个 session 的简单实现,但是缺少了 session 超时功能的具体实现。下面是补全后的代码: ```php <?php header("Content-Type: text/html; charset=UTF-8"); $expires = 60 * 20; // session 超时时间,单位为秒 function check_user_agent() { if (isset($_SESSION['HTTP_USER_AGENT'])) { if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT'])) { exit('客户端信息异常'); } } else { $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']); } } function start_session($expire = 0) { session_start(); // 如果 $expire 不为 0,表示 session 超时时间为 $expire 秒 if ($expire != 0 && isset($_SESSION['last_visit'])) { $time_last = time() - $_SESSION['last_visit']; if ($time_last > $expire) { // 如果超时 session_unset(); // 释放所有的 session 变量 session_destroy(); // 销毁 session exit("<a href='login.html'>请重新登录</a>"); } } $_SESSION['last_visit'] = time(); // 更新 session 最后访问时间 check_user_agent(); // 检查 user-agent 一致性 session_regenerate_id(true); // 重置 session ID } ?> ``` 补全后的代码加入了 session 超时功能,通过比较当前时间和上次访问时间的差值来判断是否超时,如果超时则销毁 session 并输出重新登录的链接。同时,代码中还调用了 `check_user_agent()` 函数来检查 user-agent 的一致性,防止伪造 user-agent。最后,代码中还调用了 `session_regenerate_id()` 函数来重置 session ID,增强 session 的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值