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

Rol*_*and 25 javascript api api-key

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

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

我的问题是,如果有一种方法可以保护JavaScript中的API密钥.我不能把它放在纯文本中,因为它可以被看到代码的其他人使用.那么API会保密吗?也许从XHR的JSON文本文件中获取它?

AHM*_*AHM 21

简答:不

无论你做什么来混淆密钥,你仍然必须发送它以使其在客户端以某种方式可用,因此可以使用fx提取它.萤火虫.

即使您设计了一种令人敬畏的神奇方式来保密密钥,但在某些时候您必须提出实际的API请求,并且必须从浏览器发送,攻击者才能读出密钥来自Firebugs网络标签的纯文本.

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

  • 密钥将受到保护,但操作不会.如果门打开,小偷不需要钥匙. (13认同)
  • PHP包装器可以强制执行来自同一域的请求吗?这与"同源政策"的关系是什么?看起来确定请求者是不可靠的:http://stackoverflow.com/questions/1153967/php-source-hostname-of-a-get-request ...? (3认同)
  • @m3h0w,服务器端功能可以(并且应该)得到适当的保护,例如通过使用 TLS 连接、需要身份验证、包括授权层、正确记录、使用 CSRF 保护等。关键是_你_控制你的服务器(这实际上在多大程度上取决于您的托管环境,但现在已经足够了),但您的 _user_ 控制着他们的浏览器中发生的事情。通过将 API 密钥放在您可以控制的地方来保护它们,并行使该控制以确保它们被正确使用。 (3认同)
  • 包装器将如何改变任何东西? (2认同)