现在越来越多的JavaScript代码都加入了浏览器的特征,如果你用node去运行扣下来的JavaScript源代码,可能会报错,也可能得到的结果与浏览器上的不一致,因此也就无法通过服务器的参数校验。
所以,补充浏览器环境就显得尤为重要了。
不管它怎么检测浏览器环境,逃不过下面两点:
①,用来判断,改变逻辑
②,值参与加密运算
不管怎样的形式,在源代码的最前面补上就好了,尽量不要去更改浏览器特征所对应的源代码(值写死),除非确实没办法。
在不知道怎么补环境的情况下,可以使用 jsdom 这个库,其官网地址:
https://www.npmjs.com/package/jsdom
Github地址:
https://github.com/jsdom/jsdom#readme
由于这两个网址都有教程,我在这里就不详细说明了,大家知道有这个库就好。
这的库有个很明显的缺点:慢!可以先把功能弄出来,再去优化。
下面举两个例子来看看菜鸟的我是怎么不用jsdom这个库来补环境的。
一:判断你当前环境的window对象是否有toString方法
if (window.toString)
{
//do some thing; 修改全局变量啥的
}
这时,我们只需要将 window.toString 赋值为true即可,
window = {};
window.toString = true;
当然这样写没有问题,只是个逻辑,如果还判断了是否为函数:
if (typeof window.toString === 'function')
{
//do some thing; 修改全局变量啥的
}
这时我们依葫芦画瓢将其定义为函数:
window.toString = function(){};
如果对返回值进行了判断或者参与了加密运算,则直接在浏览器的控制台上运上看看返回值是啥:
再依照它的结果补上去就可以了:
window.toString = function() {return "[object Window]"};
二:下面是某cdn的部分代码:
document["createElement"]("img")["src"] = "/R=1&e=" + Math["random"]();
这种情况下,当前node环境如果没有 createElement 函数,肯定是会报错的。那该怎么去补呢,我们来分析:
document["createElement"] 是一个函数,你可以这样定义:
document = {};
document.createElement = function(){};
它传递了一个实参 "img",因此还需要参数,像这样:
document.createElement = function(img){};
这样肯定还不行,document["createElement"]("img") 代码后面加了个 ["src"],那说明
1.当实参为 "img"时,有返回值,
2.返回值是一个object类型。
document.createElement = function(img){
if (img === "img")
{
return {};
}
};
上面的代码就可以满足条件了,如果你想更完美,可以像下面这样:
document = {};
document.createElement = function(img)
{
if (img === "img")
{
return {src:""};
}
}
是不是很简单?
文章首发本人微信公众号:菜鸟学Python编程
欢迎关注。