Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以通过用户脚本检测页面修改?_Javascript_Web Applications_Greasemonkey_Userscripts - Fatal编程技术网

Javascript 是否可以通过用户脚本检测页面修改?

Javascript 是否可以通过用户脚本检测页面修改?,javascript,web-applications,greasemonkey,userscripts,Javascript,Web Applications,Greasemonkey,Userscripts,如果你有一个网站,你能找出访问者是否正在用javascript用户脚本修改你的网站吗?如果你自己没有脚本来修改内容,你可以将document.body.innerHTML和document.head.innerHTL与它进行比较 当您在脚本中更改DOM时,可以更新值以与之进行比较。使用setInterval定期进行比较。如果您自己没有更改内容的脚本,请将document.body.innerHTML和document.head.innerHTL与原样进行比较 当您在脚本中更改DOM时,可以更新值

如果你有一个网站,你能找出访问者是否正在用javascript用户脚本修改你的网站吗?

如果你自己没有脚本来修改内容,你可以将document.body.innerHTML和document.head.innerHTL与它进行比较


当您在脚本中更改DOM时,可以更新值以与之进行比较。使用setInterval定期进行比较。

如果您自己没有更改内容的脚本,请将document.body.innerHTML和document.head.innerHTL与原样进行比较


当您在脚本中更改DOM时,可以更新值以与之进行比较。使用setInterval定期进行比较。

简言之:EEEEEEK!别这样!相反,决定需要保护的东西,并加以保护。不惜一切代价避免轮询(定期检查)。特别是,避免定期对任何东西进行严格检查


并不是所有的变化都可以跟踪。大多数变化都很难跟踪,因为有太多的事情可以改变

可以检测到对DOM的更改(新节点、删除的节点、更改的属性)。另一个答案建议定期检查
innerHTML
,但最好使用(Firefox、Chrome支持)或更旧的变异事件(
domsubtreemedited
等)(支持因事件而异)

除非手动比较每个方法和属性(EEK),否则无法可靠地检测到对标准方法的更改。这包括需要引用成吨的对象,比如说,
Array.prototype.splice
(当然还有
Array
Array.prototype
),并定期运行大量脚本。然而,这不是用户脚本通常所做的

输入的状态是属性,而不是属性。这意味着文档HTML不会更改。如果脚本更改了状态,
change
事件也不会触发。同样,唯一的解决方案是手动轮询每个输入(eeek)

没有可靠的方法检测是否已附加事件处理程序。对于初学者,您需要保护
onX
属性(第2段),检测对
addEventListener
(ek)的任何调用(不触发第2段检查),检测库对相应方法的任何调用(
jQuery.bind
和其他几个方法)


有一件事对您有利,而且可能是唯一的一件事:用户脚本在页面加载时运行(不会更快),因此您有足够的时间准备防御措施。(感谢布罗克·亚当斯的关注和链接)

您可以通过使用自己的(ek)替换标准方法来检测是否调用了该方法。有许多方法需要以这种方式(eek)进行测试,有些是通过浏览器,有些是通过您的框架。IE(甚至firefox都可以接受指令,谢谢@Brock)不会让你接触DOM类的原型,这一事实在“eek”中又增加了一两个“e”。某些方法只能通过方法调用(返回值、回调参数)获得,这一事实又增加了一个“e”或两个,总共是“eek”。在整个
窗口
中爬行的想法将被安全异常和不可跟踪的安全异常所阻止。也就是说,除非您不使用iFrame并且不在iFrame内

即使检测到每个方法调用,也可以通过写入
innerHTML
来更改DOM。Firefox和Chrome支持变异观察者,因此您可以使用它们

即使您检测到对预先存在的方法的每个方法调用并侦听突变,大多数属性都不会反映出来,因此您也需要查看每个对象的所有属性。祈祷有人不会用你永远猜不到的密钥添加不可枚举的属性。顺便说一句,这也将捕获DOM突变。在ES6中,可以观察对象的属性集。我不确定是否可以将setter附加到ES5中的现有对象属性(同时遵守ES3语法)。轮询每个属性都是eek

当然,您应该允许自己的脚本进行一些更改。工作流程是设置一个标志(不能从全局范围访问!)“我是合法的”,完成你的工作,清除标志-记住也要在所有回调的两侧。然后,方法观察员将检查标志是否设置。属性监视程序很难检测更改是否有效,但是可以从脚本中通知它们每个合法更改(手动;再次确保userscripts看不到该通知流)。Eeek

一开始我没有意识到一个完全不同的问题:用户脚本在页面加载时运行,但它们也可以创建iFrame。用户脚本会:1)检测到你的脚本拦截器,2)从运行轨道上核爆页面(你无法阻止
document.body.innerHTML=
,至少在不严重篡改
document.body
)的情况下是不可能的(但现在仍然不太可能),3)插入一个带有原始URL的iframe(防止服务器端双重加载?)和4)在加载保护之前,有足够的时间对空iframe执行操作


还有,看,这显示了我没有想到应该做的其他几项检查。

简而言之:EEEEEEK!别这样!相反,决定需要保护的东西,并加以保护。不惜一切代价避免轮询(定期检查)。特别是,避免定期对任何东西进行严格检查


并不是所有的变化都可以跟踪。大多数变化都很难跟踪,因为有太多的事情可以改变

可以检测到对DOM的更改(新节点、删除的节点、更改的属性)。另一个答案建议定期检查
innerHTML
,但最好使用(Firefox、Chrome支持)或更老的变异事件(
domsubtreemedited
等)(支持程度各不相同)