如何安全地使用谷歌API密钥

118

我正在做我的第一个项目,使用Google地图API... 我是新手,如果这很基础或显而易见,我很抱歉,但我没有找到清晰的答案或方向。以下是我从Google找到的关于安全使用API密钥的文档。


安全使用API密钥的最佳实践

在应用程序中使用API密钥时,请注意保护它们的安全性。公开暴露您的凭据可能导致您的帐户被入侵,从而可能会对您的账户产生意想不到的费用。为了保护您的API密钥安全,请遵循以下最佳实践:

不要直接将API密钥嵌入代码中:嵌入代码中的API密钥可能会意外地公开给公众,例如,如果您忘记从共享的代码中删除密钥。不要将API密钥嵌入应用程序中,而是将它们存储在环境变量或在应用程序源树之外的文件中。 不要将API密钥存储在应用程序源树内的文件中:如果您将API密钥存储在文件中,请将这些文件放在应用程序源树之外,以确保您的密钥不会出现在源代码控制系统中。如果您使用公共源代码管理系统,例如GitHub,则特别重要。 将API密钥限制为仅可由需要它们的IP地址、引荐URL和移动应用程序使用:通过限制可以使用每个密钥的IP地址、引荐URL和移动应用程序,您可以减少受攻击的API密钥的影响。您可以通过打开凭据页面并创建具有所需设置的新API密钥或编辑API密钥的设置来指定可以使用每个密钥的主机和应用程序。 删除不需要的API密钥:为了最小化遭受攻击的风险,请删除任何不再需要的API密钥。 定期重新生成API密钥:您可以从Cloud平台控制台凭据页面重新生成API密钥,方法是单击每个密钥的“重新生成密钥”。然后,更新您的应用程序以使用新生成的密钥。在生成替换密钥后的24小时内,旧密钥将继续工作。 发布您的代码之前请检查代码:确保在公开发布代码之前,您的代码不包含API密钥或其他任何私人信息。


现在我的问题是我无法弄清楚如何在网站上运用Google地图而不直接将其放在代码中。现在我的API在我的index.html文件中,就像这样:

<script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
</script>

但是,这又直接出现在我的代码中供全世界查看,我认为这不是正确的做法。


可能是如何保护我的Google Maps API密钥?的重复问题。 - Burgi
2个回答

99

对于Google Maps Javascript API v3,密钥必须在您的页面上公开。 适用的文本如下:

将您的API密钥限制为仅供需要的 IP地址、引荐URL和移动应用程序使用

前往Google API控制台生成一个密钥,并将其限制为您拥有的URL(或希望在上面放置地图的URL),以防止配额“被盗”。

作为额外的步骤,建议设置请求次数的限制


40
仅限于URL的限制并不安全,因为HTTP引用可以很容易地伪造。 - Danny Ocean
3
如果将其限制为 URL 不安全(因为 HTTP 引用者可能被欺骗,或者某人可以在他们的主机文件中运行您的 API 密钥,并将您的 URL 指向他们的本地主机服务器),那么如何才能更好地保护像 Javascript Google Maps API 这样向客户端/终端用户公开 API 密钥的谷歌 API 密钥?我认为我没有看到其他在 Google Dev Console 中限制密钥的方法(按 IP,但这对于客户端 API 密钥不起作用,因为终端用户在公共网站上具有不同的 IP)。 - armyofda12mnkeys
2
@armyofda12mnkeys 当我研究这个主题时,唯一安全的方法(安全意味着无法窃取API密钥)是使用反向代理。不幸的是,当使用Google JS SDK时,它并不能真正起作用。您将能够获取SDK而不暴露API密钥,但是一旦SDK在客户端上下载,它将使用您的API密钥进行请求,这可以通过浏览器开发人员工具轻松观察到。然而,如果您使用REST API而不是SDK,则可以代理这些请求而不暴露API密钥。不确定Google是否提供相应的REST API。 - Danny Ocean
2
有人找到了答案吗?因为引荐者可以被欺骗。代理是一种解决方案,但似乎更费力,寻找一个不会牺牲简单性的更简单的解决方案。 - PCB
2
刚刚测试了一下,URL保护简直就是个垃圾。任何人都可以使用referer运行wget并烧光你的钱包。 - Katelynn ruan
我认为它最多可以防止标准网络浏览器和公共站点的用户在不运行您的代码的情况下被诱骗使用您的客户端ID。因此,它有助于防止以您的名义钓鱼用户。如果这不是您的主要问题,比如地图费用过高,那么它的重要性就不那么大了。 - Tom Palmer

28
您所提到的API密钥最佳实践文章只是提供了使用API密钥的一般准则,在某些面向终端用户的API(例如Google Maps JavaScript API)中,您无法避免将API密钥暴露给终端用户。
因此,在公共Maps JavaScript API应用程序中,强烈建议为生产系统中使用的任何密钥添加引荐者限制,特别是公开面向的应用程序,并且仅授权您的应用程序的域、主机甚至完整文件URL。
当您在Google API控制台中创建密钥并选择设置Maps JavaScript API凭据时,向导将指示您如何保护密钥,并提示您授权的URL。

4
你可以使用第二把密钥进行本地主机测试,这样你就不需要在生产密钥上启用来自“localhost”的请求了。请问需要翻译其他内容吗? - fIwJlxSzApHEZIl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接