如果你有一个网站,你可以以某种方式找出访问者是否正在用JavaScript脚本修改你的网站?是否可以通过用户脚本检测页面修改?
回答
总之:EEEEEEK!不要这样做!相反,决定什么需要被守卫,并且后卫那。不惜一切代价避免轮询(定期检查)。尤其要避免对任何事情进行定期的严格检查。
不是每一个变化都可以追踪。大部分变化都非常难以追踪,因为可以改变的东西太多了。
可以检测DOM(新节点,删除的节点,已更改的属性)的更改。另一个答案建议定期检查innerHTML
,但最好使用mutation observers(由Firefox,Chrome支持)或较旧的突变事件(DOMSubtreeModified
等)(支持因事件而异)。
除了通过比较每个单一方法和手动属性(eeeek)之外,不能可靠地检测标准方法的更改。这包括需要引用万吨的对象包括,比如说,Array.prototype.splice
(和Array
和Array.prototype
为好,当然),并定期运行重脚本。但是,这不是用户脚本通常所做的。
输入的状态是属性而不是属性。这意味着文档HTML 不会更改。如果状态被脚本更改,则change
事件也不会触发。再次,唯一的解决方案是轮询手动(eeek)每个输入。
没有可靠的方法来检测是否已附加事件处理程序。首先,你需要警惕的onX
属性(第2号),检测到addEventListener
(EK)任何呼叫(不跳闸段#2支票),您的图书馆(jQuery.bind
和其他几个人检测到相应的方法的任何调用)。
一个件事,对你有利的发挥,也可能是唯一一个:用户脚本在页面加载(从来没有更早)运行,因此你有充足的时间来准备你的防御。not even that plays in your favor(感谢Brock Adams注意和链接)
你可以通过用你自己的(ek)替代它来检测标准方法。有很多方法需要用这种方式进行测试(eek),有些是通过浏览器进行的,有些是通过框架进行的。事实上,IE浏览器(甚至可以指示firefox,谢谢@Brock)不会让你触摸DOM类的原型为“eek”添加另一个“e”或者两个。一些方法只能通过方法调用(返回值,回调参数)获得的事实添加了另一个“e”或两个,总共为“eeeek”。对整个window
进行爬网的想法将被安全异常和不可捕获的安全异常所挫败。也就是说,除非您不使用iFrame,并且您不在iFrame内。
即使你检测每一个方法调用,DOM可以通过写innerHTML
改变。 Firefox和Chrome支持Mutation Observers,所以你可以使用这些。
即使你检测每一个方法调用预先存在的方法,听听突变,大部分属性由既不反射,所以你需要的每一个对象,以及观看所有属性。祈祷某人不会使用您永远不会猜到的密钥添加非可枚举属性。顺便提一句,这也会捕获DOM突变。在ES6中,可以观察对象的属性集。我不确定是否可以将setter附加到ES5中的现有对象属性(同时遵守ES3语法)。轮询每个属性是eeeek。
当然,你应该让自己脚本,做一些变化。工作流程将设置一个标志(不能从全局范围访问!)“我是合法的”,做你的工作,并清除国旗 - 记得也侧重所有的回调。方法观察者然后将检查设置的标志。财产看门狗将很难检测到更改是否有效,但可以从每个合法更改的脚本中通知他们(手动;再次确保用户脚本无法看到该通知流)。 Eeek。
有一个完全不同的问题,我起初并没有意识到:用户脚本在页面加载时运行,但它们也可以创建iFrame。这并不是完全不可能的(但仍不太可能)(现在为),脚本会:1)检测你的脚本拦截器,2)从轨道核对页面(你不能阻止document.body.innerHTML =
,至少不会严重篡改document.body
), 3)插入一个带有原始URL的单个iframe(防止双重加载服务器端?)和4)在您的保护被加载之前有足够的时间来处理空的iframe。
而且,看到the duplicate found by Brock Adams,这表明我没有想到的,应该做一些其他检查。
修改Re:'用户脚本在页面加载时运行(不会更早),所以你有足够的时间来准备你的防御。“......不,每个支持脚本的浏览器都支持[在任何页面加载之前启动。](http:// developercript.chrome.com/extensions/content_scripts.html#run_at)userscript可以覆盖原型并隐藏所有类型的观察者和安全措施。在Firefox和Opera的情况下,在执行之前有选择性地阻止或编辑页面的JavaScript并不难。在Chrome中并不容易。另外,Firefox对象可以被冻结,所以页面不能覆盖它们。 –
@BrockAdams将其划掉了,谢谢 –
Re:“相反,决定需要保护什么,并且保护那个。”+1。不信任客户。始终在服务器端验证,消毒和交叉引用。最后,如果数据是好的(并且游戏规则没有违背他人的危害),那么无论客户做什么或者他做了什么都没有关系。 (然而,我怀疑OP是一个担心对策的编剧。) –
- 1. 是否可以通过.bat/.cmd脚本修改注册表项?
- 2. 是否可以通过脚本检查Vagrant框是否过期?
- 3. jQuery - 检测用户是否可以看到页面底部
- 4. 可以通过画布检查用户是否喜欢某个页面?
- 5. 通过脚本修改CSV
- 6. 是否可以检测页面是否包含PHP?
- 7. 是否可以通过Javascript更改页面放大Mobile Safari?
- 8. 检测远程页面是否改变
- 9. 是否可以通过JavaScript检测插件是否被激活?
- 10. 检查脚本是否存在页面
- 11. 是否可以通过脚本标签加载压缩脚本?
- 12. 如何检测用户是否以PHP离开页面
- 13. 检测页面是否通过.htaccess在PHP中调用RewriteRule
- 14. 是否可以通过REST服务更改TemplateID - “修改模板”
- 15. 是否可以通过smtp通过bash脚本发送邮件?
- 16. 是否可以让“ajaxed”页面使用调用者的脚本?
- 17. iPhone:如何检测是否可以修改EKEvent实例?
- 18. 如何检测某些文本框是否通过外部脚本更改?
- 19. 是否可以编写自修改的PowerShell脚本?
- 20. 是否可以修改PrintDialog?
- 21. 是否可以通过QNetworkAccessManager检测可恢复的链接
- 22. 当我更改页面时,是否可以更改脚本中的类名称
- 23. 检测用户是否修改了程序使用的dll
- 24. 可以通过修改页面表来移动内存页面吗?
- 25. 是否可以接受使用一个类你可以通过修改
- 26. 我可以通过APNS反馈检测用户是否擦除设备吗?
- 27. 如何检测Node.js脚本是否通过shell管道运行?
- 28. 如何检测脚本是否通过计划任务运行
- 29. 检查gradle测试是否通过shell脚本
- 30. 如何通过重定向检测页面是否被请求?
你想要什么样的修改,来检测和哪种浏览器? –
简答:是的。 ......较长的回答:以用户无法阻止的方式来检测mod是非常困难的。 ......理论上,用户可以阻止任何网站的行为(除了黑暗)。 –