检查是否安装了扩展程序,如果用户删除了扩展程序则关闭选项卡

Check if extension is installed, and close tab if user removes extension

这就是我网站的运作方式 a.com ,用户访问我的网站,我使用我的帐户与另一个网站 b.com 的人交谈,生成一个 link b.com/somelink 并将用户重定向到 link。

问题出在这里,这个地址 b.com/somelink 包含一些私人信息,我想对访问者隐藏这些信息...因为我无法控制该网站,所以我无法访问该网站。

所以我认为最好的选择是浏览器扩展,用户必须在重定向到 b.com 之前安装扩展。

所以这是我的简单扩展:

manifest.json

{
  "name": "extname",
  "version": "1.0",
  "description": "extnameExtension!",
  "manifest_version": 2,
  "permissions": [
    "tabs", "http://*/*", "https://*/*" ,  "webNavigation"
  ] ,

  "content_scripts": [
    {

      "matches": ["*://b.com/*"],
      "js": ["contentscript.js"],
      "run_at": "document_start"
    }
  ]

}

contentscript.js

function fireOnReady() {
    document.getElementById('personal-info').innerHTML = 'some dummy data';
}
if (document.readyState === 'complete') {
    fireOnReady();
} else {
    document.addEventListener("DOMContentLoaded", fireOnReady);
}

工作正常,但我有 2 个问题:

1 - 用户可能会禁用扩展程序并刷新页面 b.com/somelink 并查看我的个人信息....所以我的解决方案是关闭浏览器选项卡打开 b.com 如果他们删除我的扩展程序。 ..有什么办法吗? (此 link 仅在他们从我的网站重定向到 b.com 时可用,因此他们不能只 copy/paste 新 tab/browser 中的 link )

2 - 在我自己的网站上,我如何确保他们在将他们重定向到 b.com 之前安装了我的扩展程序?

**请不要谈论我解释过的场景或其他解决方案,或者...我知道这听起来很奇怪,但这不是为 public 用户设计的,而是为将安装扩展的私人特殊群体设计的如果他们必须这样做,我有兴趣知道如何使用代码和扩展来做到这一点,即使我找到了另一个解决方案**

a.com 可以将 b.com/somelink 作为 iframe 嵌入,但不显示 iframe,除非它收到来自扩展程序的信号。

a.com Javascript:

iframe = document.createElement('iframe');
iframe.src = 'b.com/somelink';
setInterval(() => {
    if (!document.body.classList.contains('extension-token')) window.close();
    else if (!document.body.contains(iframe)) document.body.append(iframe);
    document.body.classList.remove('extension-token');
}, 10000);

a.com 内容脚本:

setInterval(() => {
   document.body.classList.add('extension-token');
}, 5000);

这当然不是一个安全的解决方案。

您的建议是将用户重定向到包含私人信息的页面,然后当您的扩展程序检测到该页面已加载时,从 DOM 中清除该信息。完全不管你问的关于扩展的两个问题,我都不会使用你提出的方法,因为:

  1. 隐私信息仍然发送到用户的浏览器,用户仍然可以访问。正如 所暗示的那样,几乎可以在任何浏览器中使用开发人员的工具来查看浏览器接收的数据。网络选项卡将包含页面请求, 将显示发送到浏览器的原始 HTML,您要隐藏的信息将在此处可见。对此没有解决办法,首先不发送信息。

  2. 您的扩展程序中的故障可能会暴露敏感数据。您说您无法控制显示私人信息的网站,这意味着您无法控制包含您的私人信息的元素的 personal-info ID。如果那一方的设计者决定将 ID 更改为 personal-user-info,那么您的扩展将失败并且私有数据可见。

    这与您的代码中是否存在错误无关。你在某处打错了,你的扩展没有 运行,敏感信息对用户可见。

我会重新考虑您的整个方法。确保私人信息永远不会落入用户手中的一种常用方法是让您的前端代码通过您网站上的服务器从第三方网站 (b.com) 获取所需的信息(a.com)。您的服务器可以从 b.com 获取信息,并且仅包含 必须 传递给您的用户的信息。

正如 IPirat 和 Luis 所说,在您的情况下,浏览器扩展不是一种安全的方式。用户可以禁用它,用户可以在调试器的网络选项卡中看到原始 html,用户可以 运行 另一个没有扩展名的浏览器来修改页面。您只有两个选择可以继续前进:

  1. 您必须创建将加载 b.com/somelink 的服务器端脚本,修改它并向用户发送没有您的私人数据的页面。

  2. 您可以创建自己的浏览器。例如,使用 C# 或 VBA 为 windows 使用 visual studio 创建网络浏览器非常容易。您可以分享 b.com/somelinkmodified,它将在您的浏览器中转换为 b.com/somelink,并且无法通过任何其他浏览器访问。因此,您的用户必须安装您的浏览器才能看到生成的页面。然后您的浏览器将打开此 link,将加载页面,修改然后仅显示所需信息

您可以简单地要求用户在您的网站上安装您的 Chrome 应用程序,然后在 Chrome 应用程序上执行代码(获取 link,发送重定向)。您可以使 Chrome 应用程序本质上成为一个前端(您甚至可以复制 HTML)并在那里执行所有逻辑。您将完全控制信息,因为您的 Chrome 应用程序是执行重定向的应用程序。事实上,您的 Chrome 应用程序可以在没有地址栏的情况下启动 windows 以及您可以做的其他有趣的事情。您甚至可以在内部进行 http 调用并吐出响应 html;这样你就可以完全隐藏 URL link 中的参数(我假设你担心个人信息会在那里)。

我实际上有一个 Chrome 应用程序,它充当一个门户网站,可以做你想做的事(不是故意的)。 Chrome 应用程序将让用户登录并在需要时打开 windows 到不同的网站;有时它会直接显示应用程序本身的内容(不会向普通用户公开任何 URL)。