【问题标题】:how can i intercept JS code before exectution in chrome我如何在 chrome 中执行之前拦截 JS 代码
【发布时间】:2016-11-02 08:13:20
【问题描述】:

我想为开发工具创建 chrome 扩展,我想在浏览器编译或执行当前网页的 JS 代码之前拦截它, 实际上,我想在 JS 代码在浏览器中运行之前对其进行检测。

任何人都可以帮助我们,这怎么可能?

非常感谢。

【问题讨论】:

  • 在 chrome 开发工具扩展中,如何在浏览器加载脚本之前拦截脚本。这样我就可以运行检测代码而不是原始代码
  • 这是一个非常广泛的话题,问题的形式是“我想要 X,帮助我们完成整个事情”。您应该展示您已经研究/尝试过的内容,并尝试缩小问题范围。请参阅How to Ask 指南。
  • 是的,你是对的,实际上我并不要求解决我的问题,只是需要一些关于我应该研究哪个方向来实现我的目标的建议。谢谢
  • 没有简单的方法可以做到这一点stackoverflow.com/questions/37429962/…这是我目前正在使用的一些代码:github.com/mattzeunert/FromJS/blob/master/chrome-extension/…它基本上试图阻止原始代码运行,然后注入检测的稍后代码。我目前正在对其进行重构,以使其更可用于其他项目。
  • 非常感谢,我去看看。

标签: javascript google-chrome-extension google-chrome-devtools


【解决方案1】:

没有办法挂钩到加载过程本身,但是具有未知类型的脚本不会作为脚本处理,这与具有自定义类型的脚本不执行的事实相结合,这是以下 hack 所依赖的。

调用window.stop 将阻止文档在其轨道中加载,如果我们在文档的最顶部调用它,我们可以假设文档没有加载。

然后,我们可以发出 XHR 请求来获取文档的内容,并进行一些搜索和替换,通过在将修改后的内容写入文档之前给它们一个自定义脚本类型来使文档中的所有脚本惰性化.

window.stop();
var request = new XMLHttpRequest();

request.open('GET', location.href);
request.onload = function(event) {
  var html = request.responseText
    .replace(/type=\"text\/javascript\"/g, '')
    .replace(/<script/g, '<script type="x-instrument/javascript"');

  document.open();
  document.write(html);
  document.close();
};

request.send(null);

此时,所有脚本都已被渲染为惰性,基本的顺序加载程序可能如下所示:

setTimeout(function next(index) {
  var script = document.scripts[index];
  if (script == null) {
    return setTimeout(callback, 0);
  }

  if (script.hasAttribute('src')) {
    var request = new XMLHttpRequest();
    request.open('GET', script.getAttribute('src'));
    request.onload = function() {
      var code = instrument(request.responseText);
      eval(code);

      setTimeout(next, 0, ++index);
    };

    request.send(null);
  } else {
    var code = instrument(script.textContent);
    eval(code);

    setTimeout(next, 0, ++index);
  }
}, 0, 0);

有了这个,任何页面都可以通过将此脚本插入到文档的开头来检测。

您也可以将其作为内容脚本加载到 chrome 扩展程序中,但请确保将 run_at 设置为 document_start

{
  "manifest_version": 2,
  "name": "instrument",
  "version": "0.0.0",
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["instrument.js"],
      "run_at": "document_start"
    }
  ],
  "web_accessible_resources": [
    "instrument.js"
  ],
  "permissions": [
    "tabs", "<all_urls>"
  ]
}

Example

【讨论】:

  • 这是一个可行的想法,但请注意,XHR 会丢失原始请求的某些属性,可能会破坏某些网站(例如,Referrer)。
  • @Xan true,另一种方法是让文档继续加载,但写入一个开放式的&lt;template&gt; 标签而不是调用window.stop,从而删除额外的 XHR 请求但仍然呈现惰性文档可以操纵。
  • @CasperBeyer 我是 Chrome 扩展的新手,你能建议我在哪里放置库来检测代码,它是内容脚本还是背景的一部分?
  • @CasperBeyer 如果我将检测逻辑移动到后台,那么我无法从内容脚本调用它,因为内容脚本和后台脚本之间可用的消息传递是异步的。
  • @waqasabbas 我只想构建一个包含所有依赖项等的发布包。扩展在这里做的唯一一件事就是在中间将一个隐形人注入到文档的开头。想想“这将如何作为插入到 head 部分的脚本工作”,例如使其独立而无需任何外部部门是一件好事。
猜你喜欢
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-26
相关资源
最近更新 更多