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

使用JavaScript时如何保护API密钥?,javascript,api,api-key,Javascript,Api,Api Key,所以,我正在开发一个小应用程序,只供我自己使用,也许是一个Git上的开源项目。我使用的是来自Envato Marketplaces的API,正如大家所知,有些操作不需要任何密钥,但同时也有一些确实需要密钥 我首先在PHP中为EnvatoAPI制作了一个很好的API包装器,但后来我决定用JavaScript做一点实验,所以我正在用JavaScript开发相同的包装器。到目前为止,我对公共操作没有任何问题,但我现在必须使用API密钥 我的问题是,是否有办法在JavaScript中保护API密钥。我不

所以,我正在开发一个小应用程序,只供我自己使用,也许是一个Git上的开源项目。我使用的是来自Envato Marketplaces的API,正如大家所知,有些操作不需要任何密钥,但同时也有一些确实需要密钥

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

我的问题是,是否有办法在JavaScript中保护API密钥。我不能简单地把它放在那里,因为它可以被其他看到代码的人使用。那么,是否会有一个API仍然保密的实现呢?也许用XHR从JSON文本文件中获取它?

简短回答:不

无论您如何混淆密钥,您仍然必须发送密钥以使其在客户端上以某种方式可用,因此可以使用fx提取密钥。萤火虫

即使你设计了一种神奇的方法来保密密钥,在某个时候你也必须发出实际的API请求,并且由于它必须从浏览器发送,攻击者将能够从Firebug net选项卡中以明文形式读出密钥


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

我现在的解决方案是用rust编写一个小包装器,并将其扔到/cgi容器中并调用它。这将使api密钥、api凭据和会话数据与客户端分离。

让javascript调用与服务器端php交互,以调用需要隐私的方法。@asawyer:您应该将其作为answer@asawyer-就是这样,我已经在用PHP做了,现在我只想用JS做。那么只使用JS是不可能的?如果我调用XHR从JSON文件中获取密钥,然后将其传递给该方法,该怎么办?使用javascript调试工具仍然可以很容易地找到它。如果要在javascript中使用API密钥,则无法保护它。我的建议是声明并定义一个变量
API\u KEY
作为配置选项。添加注释
//将API密钥放在此处(在http://....)
,以便希望使用包装器的开发人员可以使用它。密钥将受到保护,但操作不会受到保护。如果门是开着的,小偷就不需要钥匙。PHP包装器可以强制执行来自同一个域的请求吗?这与“同源政策”有什么关系?似乎无法可靠地确定请求者:…?包装器将如何更改任何内容?@SteffenChristensen,PHP(或其他服务器端语言)中的包装器在服务器上运行,而不是在浏览器中运行。这完全避免了将API密钥发送到浏览器。@m3h0w,服务器端功能可以(也应该)得到适当的保护,例如,通过使用TLS连接,需要身份验证,包括授权层,正确记录,使用CSRF保护等。关键是要控制服务器(这在多大程度上是真实的取决于您的托管环境,但现在已经足够好了),但您的用户可以控制在其浏览器中发生的事情。通过将API密钥保留在您可以控制的位置来保护它们,并执行该控制以确保它们被正确使用。