HBTech's Blog
用PHP向CASIO Class的API发送POST数据的探究

去年,我无聊查看了CASIO WES的一个js文件,得知了创建Class的方法(直接向一个API文件发送POST数据),因此发现了CASIO WES的一个BUG,可以向其API疯狂发送包含创建Class的POST信息,以便搞垮CASIO。

https://hbtech.oss-cn-shenzhen.aliyuncs.com/blog/2015/11/huaji.jpg

我最初有两套方案:

一是用鼠标连点器,并开启浏览器的“拦截弹出窗口”功能;二是用PHP写一段发送POST数据的代码,并设置Cron,每5~10分钟就监控一次,每次会发送40~50次POST数据(即可以创建40~50个Class)。

意料之中,CASIO在大概一星期后封锁了这个BUG。最初,无论是用PHP还是直接在网页上(点击按钮)发送的POST信息都会显示超时,无法正常创建。当时个人推测CASIO被打怕了……就暂时禁止创建Class了(实测当时即使用CASIO EDU+也无法成功创建),于是就暂时放下,不再设置Cron监控。

今年初,又一次无聊之下,发现网页可以成功创建Class了,但有时间限制。随后发现了奇怪的事:用PHP来POST得到503错误!

503错误,指服务器主动拒绝了客户端的请求。如果说是IP的原因,那在网页上又怎么可能成功创建?……

我猜测CASIO在js代码上又动了手脚(增加了API key什么的),结果发现并没有改动。

看来是CASIO在后端做了手脚 背后一定有肮脏的屁眼交易

进行了无数次的代码排查后,最初推测可能CASIO给客户端存储了一些Cookie ,以此区别PHP和正常用户的请求,但经证实并没有。

经过思考,对比了普通请求和PHP的请求,认为CASIO是通过UA来识别非法请求的!

UserAgent,简称UA,其中包含了浏览器信息。简单的说,通过UA,可以识别你在用什么浏览器。具体的我就不多讲什么了,自行Google 。

事实证明的确是这样!我最初是用file_get_contents来发送POST数据,在Google找了一下,只找到找到可以用curl来模拟UA发送请求的代码。

迅速复制下了做了个实验,果然可行!!!

经过修改,代码如下:


<?php
header("Content-type: application/json");
function post($durl, $timeout , $data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $durl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT'] );
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
$r = curl_exec($ch);
return $r;
}
echo post("http://wes.casio.com/class_api/class.php",500,$_POST)
?>

这是API版的,向其POST数据后会返回json格式的数据,就像这样:


{"result":true,"result_status":"00","class_number":"RSs0-Og12-hPqJ-cG1H","date_update":"2016-02-21 02:25:23"}

仅需要Class Number 的可以用json_decode函数进行解析(参考我之前的文章)。

HBTech's Blog

用PHP向CASIO Class的API发送POST数据的探究
去年,我无聊查看了CASIO WES的一个js文件,得知了创建Class的方法(直接向一个API文件发送POST数据),因此发现了CASIO WES的一个BUG,可以向其API疯狂发送包含创建Class的POST信息,以…
扫描二维码继续阅读
2016-02-20