记一次编码引发的血案

/ 0评 / 0

0x01 前言

有一个API接口,po主想快点写出一个exe脚本调用这个API并返回值,考虑了一下还是祭出了老古董vb,本以为只需两三个控件,几行代码就能解决,结果发现事情远没有如此简单。

0x02 出现问题

参数共有两个,两个值传入,然后构造url,再把构造出的url赋值为webbrowser的navigate实现访问,代码写完,开始调试,结果出现了特别玄学的一幕:

构造同样的URL在宿主机(vb安装在win7虚拟机中)上访问却可以正常返回内容:

明明是同样的参数,返回的结果却不相同,百思不得其解之际,再看看php代码有没有什么错误,排查半天也没找出有什么错误,再看看vb构造的URL是否有问题,也没有

而且在chrome浏览器可以返回正确的响应,那可能就是参数问题了,另外vb中的webbrowser控件是基于IE的,难道是IE的问题吗?

0x03 编码

果不其然,在虚拟机中用IE访问相同的URL结果返回没有找到答案的错误:

就在怀疑人生的时候,我无意中把chrome上的URL直接复制粘贴到虚拟机中的IE里访问,这次又成功了!

同时,地址栏里question的值引起了我的注意,这似曾相识的感觉,是URL编码吧,立马把这三个字符进行urlencode,结果验证了这样的猜想:

再看看IE的html响应代码,服务器端接受的参数未乱码,这也就解释了为何数据库检索会返回未找到任何记录集:

0x04 解决

百度上找到一段vb进行UTF-8 URLEncode的函数,直接调用这个函数把中文转换成URI编码即可解决问题。

0x05 总结

这个案例最主要的还是让我了解了chrome和IE两者关于编码处理的不同之处,浏览器在传递url的时候,会使用自己的编码格式对地址进行编码,如果浏览器所使用编码与服务器采用编码不一致,服务器接收到的参数就会出现乱码。(在firefox,chrome下正常,ie下会出现乱码。)

发表回复

您的电子邮箱地址不会被公开。