gpt4 book ai didi

javascript - 如何检查默认的JS对象是否被修改?

转载 作者:行者123 更新时间:2023-11-30 19:32:00 27 4
gpt4 key购买 nike

我如何从我的 JS 脚本(在我的 HTML 页面上运行,加载到用户的浏览器中)检查某些基本 JS API 是否被用户(浏览器扩展或其他)欺骗?像 HTMLElement.prototype.appendChild() 方法或 screen.width 属性?

最佳答案

一个基本的(但绝不是万无一失的)方法是检查函数是否仍然由本地代码组成。如果没有,那么它肯定是被猴子修补了;如果是这样,那么如果它被 monkeypatched,它也有意更改其 toString 方法,以避免这种检测(这是可能的,但可能很少见):

const checkValid = () => {
const { appendChild } = Node.prototype;
if (appendChild.toString() === `function appendChild() { [native code] }`) {
document.write('Might not have been modified<br>');
} else {
document.write('Definitely modified<br>');
}
};


checkValid();
Node.prototype.appendChild = () => {
console.log('My monkeypatched function');
};
checkValid();
// Check is foolable via:
const fooler = function appendChild() {
console.log('My monkeypatched function');
};
fooler.toString = () => `function appendChild() { [native code] }`;
Node.prototype.appendChild = fooler;
checkValid();

Like HTMLElement.prototype.appendChild() method

appendChild直接在的对象是Node.protoype。如果monkeypatcher已经把它放在HTMLElement.prototype(或者元素本身),这很容易检测到:

const div = document.querySelector('div');
if (HTMLElement.prototype.hasOwnProperty('appendChild')) {
console.log('Definitely modified');
}

if (div.appendChild !== Node.prototype.appendChild) {
console.log('Definitely modified');
}
<div></div>

关于javascript - 如何检查默认的JS对象是否被修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56337988/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com