Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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_Google Chrome Extension - Fatal编程技术网

你会钩吗;“低水平”;在javascript中调用,以便记录执行情况?

你会钩吗;“低水平”;在javascript中调用,以便记录执行情况?,javascript,google-chrome-extension,Javascript,Google Chrome Extension,假设我希望能够检测是否有人调用以下方法: document.querySelectorAll('input'); 我是否可以挂接此调用,以便在我的上下文中加载任何其他脚本时,我可以记录其执行情况 上下文:我正在考虑通过chrome扩展减轻浏览器中人攻击的方法,功能挂钩是我想到的一件事 巧妙地演示了我可以挂接一个调用以供自己使用,但显然其他脚本将不得不使用我的挂接函数,这会破坏我所追求的功能。我希望能够将document.querySelectorAll()挂接在所有其他脚本都不可见地使用它的级

假设我希望能够检测是否有人调用以下方法:

document.querySelectorAll('input');
我是否可以挂接此调用,以便在我的上下文中加载任何其他脚本时,我可以记录其执行情况

上下文:我正在考虑通过chrome扩展减轻浏览器中人攻击的方法,功能挂钩是我想到的一件事

巧妙地演示了我可以挂接一个调用以供自己使用,但显然其他脚本将不得不使用我的挂接函数,这会破坏我所追求的功能。我希望能够将
document.querySelectorAll()
挂接在所有其他脚本都不可见地使用它的级别上

[编辑] 补充资料

具体来说,我正在寻找一种能够检测何时
document.querySelectorAll('input')被调用,在我上下文中的任何位置,句号。本例中的上下文将是一个加载了多个脚本的页面


作为记录,我非常确定,如果不修改运行在其上的解释器,就无法通过javascript单独完成这项工作

您可以像用户土地对象一样覆盖主机/本机对象

var $ = document.querySelectorAll;

document.querySelectorAll = function () {
  console.log('Selecting elements', arguments); 
  return $.apply(document, arguments);
};
简单地将此代码段放在内容脚本中是行不通的,因为内容脚本在隔离范围内运行,并且由它们设置的任何变量对其他脚本都不可见。您必须将此脚本附加到DOM中,以便其他脚本使用重写函数

var script = document.createElement('script');
script.textContent = '(' + overriddenFunction ')()';
document.head.appendChild(script);

我强烈怀疑这需要修改浏览器的解释器,但是javascript是一个动态的野兽,谁知道呢?所以你想为其他人钩住
querySelectorAll
,并使用原始的
querySelectorAll
你自己的代码?对吗?这就是我认为你想要的,但似乎与“…其他脚本必须使用我的钩子函数,这会破坏我想要的。”你能给出一个逐步的例子吗?@apsillers,更新了这个问题。你所问的不是不可能的,但我不知道拦截每个调用如何防止MITM…?搜索猴子修补JavaScript的示例。这就像玩火一样,如果我在写一个别人会用到的图书馆,我永远不会这么做。如果只是为了你的站点,那么你只会冒着被击中自己脚的风险。不幸的是,没有办法做到这一点,也无法保证你的钩子在页面开始执行脚本之前就已经就位。