我看到许多api(例如,stripe)同时向用户提供公钥和私钥;前者用于前端,后者用于后端。如何防止别人窃取/使用公共(前端)API密钥?我看到一些人说你应该有域名白名单,但这些可能被欺骗。
关键是域(origin)不能在标准的、未修改的浏览器中被欺骗。. 当然,您的api密钥可以被来自非浏览器客户端的其他人使用,但是如果没有您的用户上下文,这有什么意义?他们将获得什么?他们不能在自己的web项目中为自己的用户使用它们,因为origin不能在浏览器中被欺骗。
仍然存在一些固有的风险(攻击者仍然能够在非浏览器客户端中使用这些密钥),但提供者方面通常也有对策来限制此类滥用的影响,您也应该为此进行设计,并始终记住这些密钥实际上并不是秘密的。例如,如果密钥是用于客户端日志收集,您必须意识到以这种方式收集的日志可能不是真实的(可以被攻击者伪造),但他们也可以在您的网站上伪造它们,因为他们可以从自己的浏览器发送他们想要的任何内容。