跨源 Chrome 扩展

2024-01-03

上周左右我一直在阅读和使用 Chrome 扩展,但我在尝试实现我想要的东西时遇到了困难。我想要创建的是一个扩展,它在后台(或默默地)访问网站,在网页上填写表格并检索响应。该网站没有 API,我无法创建服务器来执行此操作,因为该网站每小时只允许每个 IP 发出 X 个请求,因此我的请求在几个用户之后就会耗尽。

所以我的想法是创建一个后台页面,其中包含一些 javascript,使用 JS 来填写表单以 getElementById、设置值、提交表单并将响应无缝地返回给用户。

经过测试后,似乎同源政策阻止了我。这是我的代码:

_

清单.json

{
  "manifest_version": 2,

  "name": "Getting started example",
  "description": "This extension shows a Google Image search result for the current page",
  "version": "1.0",

  "permissions": [
    "activeTab", "webRequest", "webRequestBlocking",
    "https://ajax.googleapis.com/"
  ],
  "background": {
      "page": "Page.html"
    }
}

页面.HTML:

<html>
    <head>
        <script src="myJS.js"></script>
    </head>
    <body>
        <iframe src="CO-TEST-FRAME.html" width="400" height="400" id="maniframe" class="maniframe"></iframe>
        <iframe src="http://www.myserver.com/iframe/CO-TEST-FRAME.html" width="400" height="400" id="maniframe2" class="maniframe2"></iframe>
        <p id="test">new</div>
    </body>
</html>

联合测试框架.HTML:

<html>
    <head>
    </head>
    <body>
        <div id="desired" class="desired" hidden="hidden">some text</div>
    </body>
</html>

myJS.js:

window.onload = function() {
    alert("working");

    var iframe = document.getElementById("maniframe");
    var iframeStuff = iframe.contentDocument || iframe.contentWindow.document;
    var test = iframeStuff.getElementById("desired").innerHTML;

    var iframe2 = document.getElementById("maniframe2");
    var iframeStuff2 = iframe2.contentDocument || iframe.contentWindow.document;
    var test2 = iframeStuff.getElementById("desired").innerHTML;

    console.log(test);
    console.log(test2);
}

当第 9、10、11、14 行被注释掉时,我按预期得到“Some Text”,即本地框架工作正常。但是,当我取消注释这些行时,第二帧(在服务器上)会抛出以下错误

myJS.js:10 Uncaught SecurityError: Failed to read the 'contentDocument' property from 'HTMLIFrameElement': Blocked a frame with origin "chrome-extension://laocffdoafnoeipdndafcdbiaaephcah" from accessing a frame with origin "http://www.myserver.com".  The frame requesting access has a protocol of "chrome-extension", the frame being accessed has a protocol of "http". Protocols must match.

我明白为什么这会被阻止(因为人们能够恶意运行 JS),但据我所知,后台页面是在隔离的环境中运行的,因此所有风险都得到了缓解?有没有办法绕过同源政策或以其他方式实现我想要实现的目标?可能在用户页面上有内容脚本和 1x1 iframe?


似乎没有办法规避扩展页面的同源策略。看https://bugs.chromium.org/p/chromium/issues/detail?id=344341 https://bugs.chromium.org/p/chromium/issues/detail?id=344341.

您可以通过注入来实现您的目标内容脚本 https://developer.chrome.com/extensions/content_scripts进入后台页面上的 iframe 并使用内容脚本访问和操作 iframe DOM。

一个简单的例子:

将以下内容添加到您的manifest.json:

"content_scripts": [
{
  "matches": ["http://www.myserver.com/iframe/CO-TEST-FRAME.html"],
  "js": ["contentScript.js"],
        "all_frames": true
}


内容脚本.js:

console.log("Content script injected.");
var test = document.getElementById("desired").innerHTML;
console.log("Text from " + document.URL + ": " + test);

请注意,没有window.onload在内容脚本中。默认情况下,内容脚本是在 DOM 加载后注入的,因此window.onload事件不会触发。

如果后台页面和内容脚本之间需要进行一些通信,您将需要使用消息传递 https://developer.chrome.com/extensions/messaging。 SO 上有很多与此相关的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨源 Chrome 扩展 的相关文章

随机推荐

  • XML序列化结构

    很抱歉无法更具体地表达标题 但我只能通过举例来解释 我正在尝试构建一个序列化为以下 XML 的类
  • 使用 Azure Data Lake Analytics 与传统 ETL 方法的原因

    我正在考虑使用我最近几周一直在研究的数据湖技术 与我多年来一直使用的传统 ETL SSIS 场景进行比较 我认为数据湖与大数据密切相关 但是使用数据湖技术与 SSIS 之间的界限在哪里 使用 Data Lake 技术处理 25MB 100M
  • 全屏 Direct3D 应用程序中的 Web 浏览器

    我需要在全屏 Direct3D 应用程序中拥有一个可以正常工作的 Web 浏览器 例如 当您加入服务器时 Valve 的基于源的游戏 某种程度上 会在 MotD 窗口中执行此操作 关于去哪里看有什么建议吗 第二人生 使用 ubrowser
  • Flying Saucer 的 .NET 版本或端口

    有没有类似的开源 NET项目 或端口 飞碟项目 http code google com p flying saucer which 使用 iText 将 HTML 渲染为 PDF http today java net pub a tod
  • sidekiq_mailer 尝试发送电子邮件时出错

    我将 gem 添加到我的应用程序中sidekiq 2 15 0 和sidekiq mailer 0 0 6 当我尝试发送电子邮件时 我收到 NoMethodError undefined method key for
  • Spring Boot使用多个数据源时如何设置多个连接池?

    我有一个连接到两个独立数据库的 Spring Boot 应用程序 一切正常 我按照the docs https docs spring io spring boot docs current reference html howto dat
  • 用于矩阵向量乘积的 Rcpp Parallel 或 openmp

    我正在尝试对共轭梯度的朴素并行版本进行编程 所以我从简单的维基百科算法开始 我想改变dot products and MatrixVector产品通过其适当的并行版本 Rcppparallel 文档具有以下代码dot product使用并行
  • 运行时错误 - 张量的元素 0 不需要 grad 并且没有 grad_fn

    我正在使用 Unet 模型进行语义分割 我有一个自定义的图像数据集及其掩码 均为 png 格式 我查看了在线论坛并尝试了一些东西 但没有多少效果 任何有关如何解决错误或改进代码的建议都会有所帮助 model eval with torch
  • Javascript |基于连续字母条件的动态字符数组

    我正在做一个代码战争挑战 找不到解决方案 但我真的想知道我们如何解决这个问题 因此 我们得到两个整数 假设 N 和 D 我们应该返回一个包含恰好 N 个字母 n 和恰好 D 个字母 d 的字符串 并且没有三个连续字母相同 例如 如果我们得到
  • 了解 mpreferred-stack-boundary=number

    我正在尝试可视化并理解如何利用 mpreferred stack boundary 更像是构建代码以在学校中利用它 通过阅读 gcc 手册 它指出它根据 mpreferred stack boundary number 对齐堆栈 其中 nu
  • bxslider 指令抛出错误“未捕获类型错误:无法读取未定义的属性‘indexOf’”

    我在我的应用程序中使用 angularjs 为 bxslider 创建了一个指令 以下是指令代码 angular module sbAdminApp directive bxSlider function return restrict A
  • 是否可以阻止 ActiveStorage 删除服务存储上的文件?

    我在用着ActiveStorage处理我的 Rails 应用程序中的附件 更新模型的附件时 它似乎将清除作业排入队列 并删除远程存储服务上以前的附加文件 S3 here 我不想要我的文件S3要系统删除的存储桶 即使我的数据库中没有附加任何记
  • 使用react\stomp仅消费来自RabbitMQ的N条消息,分别确认它们,然后退出

    我正在将 RabbitMQ 与 PHP React stomp 结合使用 我有两个队列 一个是 todo 另一个是 done 消费者读取 todo 完成工作 确认消息 然后将其发布到 done 队列 有什么方法可以确保我只消耗来自 todo
  • ConfigObj 和 ConfigParser 哪个更好?

    哪个更适合为 Python 程序创建设置文件 内置模块 配置解析器 http docs python org library configparser html module ConfigParser 或独立项目 配置对象 http www
  • 使用 C# 下载 Windows 更新

    有没有办法从 C 应用程序中以编程方式下载 Windows 更新 我想在我的应用程序中管理更新的安装 Windows 更新 API 是记录在这里 http msdn microsoft com en us library aa387099
  • 如何重定向到某个网址

    我想在从上一页收集数据后向客户显示另一个页面 但我在服务器端重定向新 URL 时遇到问题 这是我的逻辑 使用 POST 操作将用户输入提交到服务器 服务器运行函数 saveChoice 将用户输入保存到数据库中 保存用户输入后 服务器向客户
  • 如何从我的 video.js 播放器监听“timeupdate”事件?

    虽然我已经能够使用普通 HTML5 播放器监听 timeupdate 事件 但我似乎无法让它与 video js 一起使用 这是我的代码
  • 经典 ASP:如何在经典 ASP 中编写 unicode 字符串数据?

    如何在经典 ASP 网页中显示存储 unicode 数据 使用 zawgyi1 字体输入 的 nvarchar 列 当我检索值并将其写入页面时 它显示 我使用以下元标记将 ASP 页面的内容类型设置为 UTF 8 不幸的是 文本仍然呈现为
  • 在 setuptools 中使用 console_scripts 时出现导入错误

    我正在尝试构建一个名为dnsrep在Python中 我使用setuptools 这样我就可以调用dnsrep不使用命令的模块python dnsrep The setup py我写的脚本如下 from setuptools import s
  • 跨源 Chrome 扩展

    上周左右我一直在阅读和使用 Chrome 扩展 但我在尝试实现我想要的东西时遇到了困难 我想要创建的是一个扩展 它在后台 或默默地 访问网站 在网页上填写表格并检索响应 该网站没有 API 我无法创建服务器来执行此操作 因为该网站每小时只允