因为觉得所有在线聊天工具要经过人家的服务器不够把握,所以在自己的服务器上架设了phpfreechat。
这款在线聊天室,有着不在服务器储存任何聊天记录的优点。
然后有一天,我试图在上面发送一个数字 0
没有任何反应。
习惯性的按了下F12,发现phpfreechat提供了控制台输出。
readyState: 4, responseText: "{ "error": "Wrong message format (must be a JSON string)" }", status: 400, statusText: "error"}
哦?必须是个Json?
又去下了一份源代码,查找报错内容 “Wrong message format (must be a JSON string)”。
顺利定位到唯一一本代码,channels.php中的如下代码片段。
// check that request content contains a message $data = json_decode($req->getBody()); if (!$data or !is_string($data)) { $res->status(400); // Wrong message format $res['Content-Type'] = 'application/json; charset=utf-8'; $res->body('{ "error": "Wrong message format (must be a JSON string)" }'); return; }
如果我在第二行传入了一个0,$data仍然等于0。
在第三行,死在了!$data上。!$data是个很诡异的判断。
在PHP中,非0即true,0即false,”0″是false,’0’也是false。
就因为我写了一个0,便中了招,进入了报错代码块。
我们再来看一下第三行代码的意图: 如果非(false/0/null/未初始化/””/…) 或者 不是字符串的话,报错。
可是我单独打一个0,并不应该被算作非法输入。
那么改成什么好呢?