快捷搜索:  汽车  科技

奇虎360官网主页(一个官网首页的偶发)

奇虎360官网主页(一个官网首页的偶发){"code":1 "msg":"参数错误"}格式化之后为正常进入 kuai.360.cn 之后,给出这么一个 json 字符串,{"code":1 "msg":"\u53c2\u6570\u9519\u8bef"}

前言

如果不是行业相关,也就轻描淡写,F5 刷新过去算了。可是,给出的提示信息那么的熟悉,老味道,老配方,是可忍孰不可忍。

与其说是BUG,不如说是偶发现象,这样开发人员可无需修复了。祝你们玩的开心。


奇虎360官网主页(一个官网首页的偶发)(1)

官网首页 home.html


怎么发生的

正常进入 kuai.360.cn 之后,给出这么一个 json 字符串,

{"code":1 "msg":"\u53c2\u6570\u9519\u8bef"}

格式化之后为

{"code":1 "msg":"参数错误"}

为什么首页会产生这个错误呢,到底是那个环节出现的?是 web 服务器吗?是应用抛出的异常吗?查看之后发现,是首页网址进行了重定向。被索引到这个资源访问位置

http://kuai.360.cn/
Notice: Undefined variable: redis in /usr/share/nginx/html/logger.php on line 228

Fatal error: Call to a member function select() on a non-object in /usr/share/nginx/html/logger.php on line 228

对上述字符串进行 urldecode 转码得到

http://kuai.360.cn/<br />

<b>Notice</b>: Undefined variable: redis in <b>/usr/share/nginx/html/logger.php</b> on line <b>228</b><br />

<br />

<b>Fatal error</b>: Call to a member function select() on a non-object in <b>/usr/share/nginx/html/logger.php</b> on line <b>228</b><br />

已经很明显的指出了错误位置,文件

/usr/share/nginx/html/logger.php

第228行变量名 redis 没有定义。这个错误级别是 Notice。

还有一个致命错误 Fatal error,大概是这个错误之后抛出的。

Call to a member function select() on a non-object

然后使用 select() 方法,作用在了一个空对象上。

猜测,该处代码类似是

if ($conditions){ $redis = blabla; } $redis->select('key_name')

这样就符合了两处触发 fatal error 的错误信息。

为什么提示信息Notice也会抛出?这与PHP的运行解析机制有关,设置项

error_reporting = E_ALL

这是 php.ini 配置文件配置项,显然本项目没有修改。或者在 logger.php 文件内显式声明。所以才会把所有的故障信息抛出给客户端显示。


JSON 字符串是如何抛出的?

经过上面的提示,以及访问所在文件位置,可以推断

  1. 不是web服务器的问题。
  2. php文件有可能是意大利面写法,随写随用。
  3. 如果是Object写法,可能触发了 try - catch 语句。
  4. 猜测可能使用redis缓存一部分数据库交互的数据。
  5. 猜测可能是键值不存在,触发了 undefined variable 错误。
  6. php错误信息类型默认为 E_ALL,事无巨细都要汇报。
  7. 数据交互是在不同主机之间进行。
  8. redis 缓存服务器单独做的部署?
  9. web 服务器请求与 redis 服务器发生了网络问题?

那么上面这个notice fatal error 错误信息,怎么就附加到了 url 请求上。

由于水平有限,只能挖掘到这里了,请大神在评论区附上更深度的发现。


正常流程的请求

如果该网页访问正常,会有哪些内容和请求呢。在谷歌浏览器内使用 F12 进行查看。


奇虎360官网主页(一个官网首页的偶发)(2)

可以看到,整体页面加载完毕,使用了 jQuery 发起的四个AJAX请求。我们将有数据返回的请求贴在下面。

Request URL: https://kuai.360.cn/pb/lists?type=all&page=1&sign=50caadb0eca62c816aba2094871a4b1f&t=1581337695467&

返回的内容是JSON,经过美化后如下图:


奇虎360官网主页(一个官网首页的偶发)(3)

网络请求返回JSON数据结构

网页内的动态数据均使用此方式渲染。


写在最后

虽然有效的信息,可以供我们深挖的信息不多,整个路由体系,以及数据交互方式,都不清楚。

那么仅仅知道首页路由,使用了根目录下的一个 logger.php 文件

且该文件内的方法,意外地因为缓存键值不存在,而获取失败

最不应该的,这个 $redis 声明在局部

PHP 是弱类型语言,其变量声明,变量类型,和数组索引极易出现不在掌控之内的事。360 的程序员应该打上这个补丁。


我是@程序员小助手,持续分享编程与程序员成长相关的内容,欢迎关注~~

猜您喜欢: