上下文:
- 您有一个网络服务器,只有当您的客户端安装了您的特定 Chrome 扩展程序时,该服务器才必须提供独家内容。
- 您可以通过两种方式提供 Chrome 扩展程序包:
- 来自 Chrome 网上应用店
- 来自您自己的服务器
问题:
- 有许多解决方案可以让您知道是否安装了 Chrome 扩展程序:
- 使用 Content Scripts 在加载网页时插入元素.
- 使用 Web Requests 将特定 header 发送到服务器.
- 等
- 但似乎没有解决方案来检查与您的网页交互的 Chrome 扩展程序是否是正版。
- 事实上,由于任何人都可以查看和复制 Chrome 扩展程序的源代码,似乎没有办法知道当前与您的网页交互的 Chrome 扩展程序是否就是您拥有的那个由其他人发布 或克隆版本(可能有所改动)。
- 您似乎只能知道某些 Chrome 扩展程序正在以“预期的方式”与您的网页交互,但您无法验证其真实性。
解决方案?
- 一种解决方案可能是使用 Chrome 扩展程序包中包含的信息,这些信息不能被任何其他人更改或复制:
- 将 Chrome 扩展程序的 ID 发送到服务器?但是怎么办?
- ID 必须由您和您的 JavaScript 代码发送,似乎无法使用“内部”Chrome 函数来完成。
- 因此,如果其他人只是将相同的 ID 发送到您的服务器(某种 Chrome 扩展程序的 ID 欺骗),那么您的服务器将认为他的 Chrome 扩展程序是真实的!
- 使用打包应用程序时提供的私钥?但是怎么办?
- 似乎无法以任何方式以编程方式访问或使用此 key !
- 将 Chrome 扩展程序的 ID 发送到服务器?但是怎么办?
- 另一个解决方案是使用 NPAPI Plugins并嵌入 GPG 等身份验证方法。但这种解决方案并不理想,主要是因为其 API's doc 的“警告”部分很大。 .
- 还有其他解决办法吗?
注意事项
这个问题试图在 Chrome 扩展的 API 中提出一个真正的安全问题:如何在与您的服务交互时检查您的 Chrome 扩展的真实性。 如果有任何遗漏的可能性,或任何误解,请随时在评论中问我。
最佳答案
很抱歉,您提出的这个问题本质上是无法解决的,因为一个简单的问题:您不能信任客户。而且由于客户可以看到代码你无法解决问题。
来自客户端的任何信息都可以通过其他方式复制。这与试图证明当用户登录他们的帐户时实际上是用户而不是其他人发现或获得了他们的用户名和密码是同一个问题。
互联网安全模型是围绕 2 方建立的,试图在第三方无法模仿、修改或窃听对话的情况下进行通信。如果不隐藏扩展的源代码,客户端将无法与第三方区分开来(副本中的文件 - 无法确定哪个是哪个)。
如果源代码被隐藏,那就完全是另外一回事了。现在,用户或恶意方无法访问真实客户端知道的 secret ,并且所有常规安全模型都适用。然而,Chrome 是否允许在扩展中隐藏源代码值得怀疑,因为这会产生其他安全问题。
如您所说,可以使用 NPAPI 插件隐藏某些源代码,但它的价格如您所知。
回到当前的状态:
现在问题变成了交互的含义。
如果交互意味着当用户在页面上时您想知道它是您的扩展程序还是其他一些那么您可以获得的最接近的是在 app 下的扩展程序 list 中列出您的页面记录部分 here
这将允许您在页面上询问是否使用安装了该应用程序
chrome.app.isInstalled
这将返回 bool 值,显示您的应用程序是否已安装。该命令已记录 here
然而,这并没有真正解决问题,因为扩展可能已安装,但未启用,并且还有另一个扩展模拟与您网站的通信。
此外,验证是在客户端进行的,因此可以覆盖任何使用该验证的函数以忽略此变量的结果。
但是,如果交互意味着发出 XMLHttpRequests,那么您就不走运了。如上所述,由于源代码的可见性,无法使用当前方法完成。
但是,如果它将您的网站的可用性限制在授权实体,我建议使用常规身份验证方式:让用户登录将允许您创建 session 。此 session 将传播到扩展程序发出的所有请求,因此您可以解决常规客户端登录信任问题,例如帐户共享等。当然,可以通过让用户通过他们的 Google 帐户登录来管理这些问题,大多数人都不愿意共享并通过阻止似乎被滥用的帐户进一步缓解。
关于javascript - 如何检查 Chrome 扩展程序的真实性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12460297/