【问题标题】:secure the code in google chrome extension保护 google chrome 扩展程序中的代码
【发布时间】:2013-05-26 19:48:41
【问题描述】:

我想写一个谷歌浏览器扩展,它应该向我的网站发出请求以发送和获取一些数据,所以,实际上我应该像这里写的那样做一个 ajax 请求https://developer.chrome.com/extensions/xhr.html

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://api.example.com/data.json", true);

我想问是否有办法以某种方式保护代码或阻止其他人使用我的 api,因为实际上其他用户在安装扩展程序时可以看到它的源代码,因此在我不知道的情况下使用我的 api 。

编辑:

如果我需要进行某种身份验证,那么在进行 ajax 调用之前如何对用户进行身份验证?对于身份验证,我需要向我的服务器发送请求,但为此我应该发送,例如用户名和密码,应该保存在扩展程序文件的某个位置,实际上,用户在安装扩展程序时可以看到。

谢谢

【问题讨论】:

  • 您在 chrome 扩展程序中公开了一个公共 api - 并且您不希望该扩展程序的其他用户使用它?那这个api是什么意思呢?
  • 您可以使用 google chrome 身份验证 api 识别您的用户,并在您身边存储一些东西以确保用户拥有权限。见这个谷歌文档; developer.chrome.com/apps/app_identity.html
  • @madflow,如果我想让我的 api 只被授权的人使用怎么办,那没有意义吗?
  • 谢谢@Happyninja,我会查看文档
  • @Davo - 如果您希望您的 API 只能由授权人员使用,那么您需要包含一些身份验证模式......例如,如果您假设所有连接都已获得授权,那么您当然可以有缺陷。也许查看 oAuth 并使用令牌。 developer.chrome.com/extensions/tut_oauth.html.

标签: api google-chrome-extension


【解决方案1】:

不要信任浏览器,而是采取措施对用户进行身份验证。因此,在这种情况下,您可以要求您输入用于与服务器通信的密码。

您的 Google 扩展程序会要求您在尝试使用 AJAX 与您的服务器通信之前输入密码。

请注意,您应该建立保护自己免受暴力攻击的方法。所以,如果密码错误多于少数,请执行锁定所有操作等操作。

您也可以考虑使用密码来简单地解密 XHR 的目的地,但如果您走这条路,您应该非常小心地存储它,因为这将在离线时被暴力破解。

编辑 试图锁定一个 API 以便只有一个应用程序可以使用它是不切实际的,在技术上也不可行,所以你唯一的希望是使用 API 对用户进行身份验证,而不管他使用的是什么访问软件。您可以让用户签署一项协议,在法律上将他们仅限于您的扩展程序,但我怀疑这将在很大程度上无法执行,并且会消耗您跟踪滥用者的时间。

如果您不希望未经授权的人知道 API 在哪里,您可以使用带外机制执行身份验证:通过电话、电子邮件、SMS,或者简单地说,另一个 API 将授予用户向您的 API 请求的密码或令牌必须随附。

在这个带外过程中,您还可以授予用户一个唯一的 URI(API 访问点),该 URI 仅在每个经过身份验证的会话中有效(例如,https://api.totally-cool-extension.com/api/ijyeDvB5dYvSiWG97OLuTAoNWwbhuZ0/)。在其他 URI 上对您的服务器的任何请求都将不起作用。但是,这在理论上与使用相同的 API 访问点并拥有一个好的密码并没有太大区别。它只是改变了架构中将执行身份验证和/或授权检查的位置数量。

<aside>我的投票是将授权/身份验证点的数量减少到尽可能少,这样您就可以花更多的时间来纠正一个地方,而不是有多个地方和可能的多个逻辑缺陷或其他事情这可能会导致漏洞。</aside>

您还可以探索使用公钥基础设施和/或一次性密码方案或基于设备的令牌生成器等,但最终,您将允许经过身份验证和授权的用户使用您的 API。而且,多亏了 Internet,这不会是一个未公开的 URI。

而且,更重要的是,它不会阻止某人自行使用这些数据。即使采取了所有这些措施,授权用户在将这些数据流式传输到您的扩展程序时收集这些数据也是微不足道的。或者,如果您采用点对点加密,他们可以截屏或对您的代码使用某种形式的 JS 内省,甚至从他们的计算机内存中提取数据。

我知道你在这里寻找灵丹妙药,但它不存在。

【讨论】:

  • 但是如何在进行 ajax 调用之前对用户进行身份验证?对于身份验证,我需要向我的服务器发送请求,对吗?但为此我应该发送,例如用户名和密码,应该保存在扩展文件的某个地方,实际上是用户在安装扩展时可以看到的,对吧?
  • 更新答案以解决该问题。
  • 谢谢@mkoistinen,你说得对,我一直在寻找灵丹妙药,谢谢!
  • 但是示例 google oauthentication 如何在扩展上工作。导致通过令牌识别的谷歌 OAuth(每次都更改)。因此,chrome 扩展 API 中的令牌将不同于网站 OAuth。请在此处访问我的 SO 问题:stackoverflow.com/questions/66191910/…
【解决方案2】:

我认为你做错了。您永远不应该相信互联网用户 PC 上发生的事情。从来没有!

将信任线向内移动一步,公开您的 API,然后在您可以完美控制的地方设计安全性 - 服务器端。

【讨论】:

  • 但是如果 api 是公开的,所以任何人都可以发送和获取数据,我如何在服务器端保护它?我想确保只有那些拥有密钥的人才能使用 api,但是如果我将密钥放入扩展程序中,它是可见的并且不安全,谢谢!
【解决方案3】:

我无法正确了解您的用例

几点:

  • 您的扩展代码是always可追踪的(任何安装了扩展的人都可以查看代码)
  • 如果您通过 complicated or obfuscated coding patterns 寻求安全性,您最终会减慢理解过程而不是整个过程。
  • 如果您的目标是确保安装您的扩展程序的用户应该能够访问并使所有其他用户(获得非法访问权限或下载和编辑代码的用户)在每次安装时都有一个 会话共享密钥 .

请进一步解释用例,以便我可以更好地帮助您。

【讨论】:

  • 我的目标是确保在创建扩展后,没有人可以在扩展中查看我的代码以某种方式能够从其他网站向我的网站发出请求,或者创建其他类似的扩展并使用我向我的网站提出请求,我的评论有意义吗?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-24
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
相关资源
最近更新 更多