javascript - 如何检查Chrome扩展程序的真实性?

上下文:

  • 您的网络服务器仅在客户端安装了特定的Chrome扩展程序时才必须提供独占内容。
  • 您可以通过两种方式提供Chrome扩展程序包:
  • 来自Chrome网上应用店
  • 来自您自己的服务器

  • 问题:
  • 有许多解决方案可让您知道已安装Chrome扩展程序:
  • 使用Content Scripts加载网页时插入元素。
  • 使用Web Requests将特定的头发送到服务器。
  • 但是似乎没有解决方案来检查与您的网页交互的Chrome扩展程序是否为正版。
  • 实际上,由于任何人都可以查看和复制Chrome扩展程序的源代码,因此似乎无法知道当前与您的网页进行交互的Chrome扩展程序是否是您发布的或另一个人的克隆版本(可能有所改动)。
  • 您似乎只能知道某个Chrome扩展程序正在以“预期方式”与您的网页进行交互,但是您无法验证其真实性。

  • 解决方案?
  • 一种解决方案可能是使用Chrome扩展软件包中包含的信息,并且该信息不能被其他任何人更改或复制:
  • 是否将Chrome扩展程序的ID发送到服务器?但是如何?
  • 该ID必须由您和您的JavaScript代码发送,并且似乎无法通过“内部” Chrome函数来实现。
  • 因此,如果其他人只是将相同的ID发送给您的服务器(某种形式的Chrome扩展程序的ID欺骗),则您的服务器会将其Chrome扩展程序视为真正的扩展程序!
  • 使用打包应用程序时提供的私钥?但是如何?
  • 似乎无法以编程方式以任何方式访问或使用此密钥!
  • 我的另一个解决方案是使用NPAPI Plugins并嵌入身份验证方法(如GPG等)。但是,由于API's doc的“警告”部分很大,因此不希望使用此解决方案。
  • 还有其他解决方案吗?

  • 笔记

    这个问题试图在Chrome扩展程序的API中引发一个真正的安全性问题:与服务进行交互时,如何检查Chrome扩展程序的真实性。
    如果有任何遗漏的可能性或任何误解,请随时在评论中问我。

    最佳答案

    抱歉,您遇到的这个问题实际上是无法解决的,因为一个简单的问题:您无法信任客户。 并且由于客户端可以看到代码,所以您无法解决问题。

    来自客户端的任何信息都可以通过其他方式复制。本质上,与试图证明用户登录其帐户时实际上是该用户不是发现或获得用户名和密码的其他用户一样。

    互联网安全模型是围绕两个试图进行通信的各方建立的,而第三方无法模仿一个​​人,修改或收听对话。如果不隐藏扩展名的源代码,客户端将无法与第三方(副本中的文件-无法确定是哪一个)区别开。

    如果源代码被隐藏,则将变成另一个故事。现在,用户或恶意方无法访问真实客户端知道的 secret ,并且所有常规安全模型都适用。但是,Chrome会允许扩展中使用隐藏的源代码是令人怀疑的,因为它会产生其他安全问题。

    如您所述,可以使用NPAPI插件隐藏某些源代码,但是它附带的价格是众所周知的。

    回到当前的状态:

    现在,它变成了什么是交互的问题。

    如果互动意味着当用户在页面上时,您想知道它是您的扩展程序还是其他扩展程序,那么最接近的方法是在扩展程序 list 的app列表中以here列出您的页面。

    这将允许您在页面上询问是否通过使用以下方式安装了该应用程序

        chrome.app.isInstalled
    

    这将返回 bool(boolean) 值,显示是否安装了您的应用程序。该命令已记录为 here

    但这并不能真正解决问题,因为可能安装了该扩展程序,但未启用该扩展程序,并且还有另一个扩展程序模拟了与您的站点的通信。

    此外,验证位于客户端,因此使用该验证的任何函数都可以被覆盖以忽略此变量的结果。

    但是,如果交互意味着发出XMLHttpRequests,那么您就不走运了。如上所述,由于源代码的可见性,因此无法使用当前方法来完成。

    但是,如果 将网站的可用性限制为授权实体,我建议使用常规的身份验证方法:让用户登录将允许您创建 session 。该 session 将传播到扩展程序发出的所有请求,因此您可以进行常规的客户登录,如帐户共享等信任问题。当然,可以通过使用户通过其Google帐户登录来管理这些问题,而大多数情况下,他们都不愿意通过阻止似乎被滥用的帐户来共享并进一步缓解。