技术解析

JS 有什么手段可以判断一个函数是不是原生代码吗?
0
2021-08-09 22:55:19
idczone

比如 XMLHttpRequest,有没有什么手段可以知道这个东西有没有被人为重写?
网站找了不少方法都做不到
下面是我做的一些尝试,这些检测方法都能被绕过

{
    function isNative(api) {
        return /native code/.test(api.toString()) && typeof api !== 'undefined'
    }

    let test = function (input, fake) {
        console.log("------------------------")
        console.log("是否是伪造:", fake)
        console.log("toString:", input.toString())
        console.log("toString.toString:", input.toString)
        console.log("prototype 方法", input.hasOwnProperty("prototype"))
        console.log("toString.call","方法",Function.prototype.toString.call(input))
        console.log("网传最不靠谱方法:isNative", isNative(input))
    }
    test(XMLHttpRequest, false)
    {
        let XMLHttpRequest = function () {
            "[native code]"
        }
        XMLHttpRequest.toString = function () {
            return "function XMLHttpRequest() { [native code] }"
        }
        let toString = function () {
            return "function toString() { [native code] }"
        }
        toString.toString = toString
        XMLHttpRequest.toString.toString = toString
        Function.prototype.toString = toString
        delete XMLHttpRequest.prototype
        test(XMLHttpRequest, true)
        // XMLHttpRequest.prototype = undefined
        // test(XMLHttpRequest, true)
    }
}

Function.prototype.toString.call

哦,不行

如果原型链上的 toString 被修改了,就只能检测到 toString 被修改这一步了

怎么检测 tostring 被修改了?

你可以构造一个函数,然后 toString 输出

不行,我试过

首先你先想想怎么给“原生 /非原生”下一个明确的、可量化、可操作的定义。
有了定义,才有分类的判断标准。
如果能拿到目标函数原始的代码,那么可以用代码做指纹...

Function.prototype.toString.call(Function.prototype.toString) 这样检测
数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服