使用 JavaScript 时如何保护 API 密钥?

IT技术 javascript api api-key
2021-02-24 00:59:36

因此,我正在开发一个仅供我自己使用的小型应用程序,并且可能是一个关于 Git 的开源项目。我正在使用 Envato Marketplaces 的 API,众所周知,有些操作不需要任何密钥,但同时也有一些操作需要。

我首先用 PHP 为 Envato API 制作了一个很好的 API 包装器,但后来我决定用 JavaScript 做一些实验,所以我正在用 JavaScript 开发相同的包装器。到目前为止,我的公共操作没有问题,但我现在必须使用API​​ Key。

我的问题是是否有办法保护 JavaScript 中的 API 密钥。我不能只是将它以纯文本形式放在那里,因为它可以被其他看到代码的人使用。那么会有一个 API 保持秘密的实现吗?也许是从带有 XHR 的 JSON 文本文件中获取它?

2个回答

简短回答:否

无论您做什么来混淆密钥,您仍然必须发送它以使其在客户端上可用,因此可以使用 fx 提取它。萤火虫。

即使您设计了一种很棒的神奇方法来保密密钥,在某些时候您也必须发出实际的 API 请求,并且由于它必须从浏览器发送,因此攻击者将能够读出密钥Firebugs net 选项卡中的纯文本格式。

正确的做法是围绕需要密钥的 API 调用创建一个 PHP 包装器,然后从 Javascript 调用该包装器。

@m3h0w,服务器端功能可以(并且应该)得到适当的保护,例如通过使用 TLS 连接、需要身份验证、包括授权层、正确记录、使用 CSRF 保护等。关键是您可以控制您的服务器(这实际上是正确的程度取决于您的托管环境,但现在已经足够了),但您的用户可以控制浏览器中发生的事情。通过将 API 密钥放在您可以控制的地方来保护它们,并执行该控制以确保它们被正确使用。
2021-04-25 00:59:36
包装器将如何改变任何东西?
2021-05-05 00:59:36
密钥将受到保护,但操作不会。如果门是开着的,小偷就不需要钥匙了。
2021-05-07 00:59:36
PHP 包装器可以强制请求来自同一个域吗?这与“同源政策”有什么关系?看起来确定请求者并不可靠:stackoverflow.com/questions/1153967/ ... ...?
2021-05-14 00:59:36
@SteffenChristensen,在PHP的包装(或其他一些服务器端语言)的上运行的服务器,而不是在浏览器中。这完全避免了必须将您的 API 密钥发送到浏览器。
2021-05-15 00:59:36

我现在的解决方案是用 Rust 编写一个小包装器,然后将其放入 /cgi-bin 并调用它。这应该将 api-key、api creds 和 session 数据与客户端分开。