Google Maps如何保护其API密钥?如何做类似的事情?


76

当前,Google要求您创建一个API密钥,该API密钥特定于将要从中提供地图的域。Google如何执行?我想做同样的事情。

我公开了用于我的服务的API,但希望允许客户端通过javascript而不是仅从服务器嵌入对API的调用。我可以用一个随机令牌来保护它,但是任何在客户端计算机上查看代码的人都可以轻易地欺骗它。

我一直都认为这个概念是不可能的,但是Google会以某种方式很好地执行它。

编辑-听起来Google确实还没有做任何令人惊奇的事情。他们的API很可能仅用于跟踪,而不能真正保证拥有钥匙的人使用他们的API。


我相信我找到了答案。
泰勒·卡特

Answers:


30

我可以肯定他们使用REFERER URL来确定呼叫的来源。如果该域与分配给密钥的域不匹配,则该请求无效。

对于一个实际的示例,使用PHP可以检查域,$_SERVER['HTTP_REFERER']以检查引荐来源。如果域匹配,则返回有效响应。如果不是,您可以返回401未经授权或其他响应。


2
不。这是可恶的。我认为Google更有可能依赖IP地址(不容易被欺骗)和DNS查找。
泰勒·卡特

29
Ajax调用的API地址是客户端用户代理的IP地址,该客户端解析文档并执行javascript。这样,Ajax请求的IP地址与文档原始域无关。请求中与文档域相关的唯一信息是引用者。当然,引荐来源网址可以被欺骗。但是,对于Google API,将是要欺骗引荐来源网址的网站;但是,实际的欺骗只能发生在浏览器的客户端。因此,欺骗并不是威胁。
弗朗西·佩诺夫(Francis Penov)2010年

1
该检查是通过客户端的GMaps Javascript代码进行的。在这种情况下,无需检查/欺骗引荐来源网址……
Wim 2010年

5
许多“流行的安全解决方案”默认会剥离或替换引荐来源网址。这些用户是否被阻止查看该服务?
Instine 2012年

2
滥用者可以欺骗API密钥,并使用经过修改的引用程序从其Web浏览器中窃取公司的配额。它仅限于Web浏览器(客户端)。您是否认为Google在某些方面限制了给定时间范围内已标识的客户端(唯一IP地址)可以发出的请求数量?这可能会限制配额盗窃的影响。
尼采

65

API密钥本身很可能是与该密钥相关联的域的一种单列哈希,并且只有Google API服务器知道。它可能包含其他一些众所周知的信息(当然对Google而言)。当您从该域发出请求时,API服务器将使用该请求来自的域,并以相同的一种方式进行哈希计算并比较两个值。

对于Ajax调用,他们很可能使用引荐来源网址获取文档宿主的域。虽然可以伪造引荐来源网址,但最终还是要使用API​​,您需要获取Google javascript才能在文档中执行。此时,此javascript可以验证调用Ajax API调用的文档确实来自目标服务器。当然,如果您有自己的DOM实现或脚本的即时修改,这也是欺骗的。但是,这种欺骗需要在客户端进行,并且想要使用Google API的网站能够欺骗客户端软件的机会非常小。

请注意,由于该API本质上是免费的,因此他们也可以提供对其API的匿名访问。显然,Google的目的不是保护未经授权的访问,而是要确保他们可以收集有关该数据使用情况的尽可能多的数据,并将该使用情况与他们收集的有关目标域的其他数据相关联。因此,我不希望API密钥验证比我上面描述的复杂得多-更高级方法的ROI太低。

当然,也存在通过其API可能发生XSS攻击的担忧。但是我不认为他们的API密钥与他们拥有的任何反XSS代码有太多联系。


不幸的是,这听起来是最合理的答案。感谢您的输入。
Vyrotek

2
“他们本来可以提供匿名访问”-请注意,某些功能受到每天请求数和API密钥(并且在发布时已被限制)的限制,例如反向地理位置。
Piskvor在2011年

1
另请注意,HTTPS上的使用不是免费的。
Arjan 2012年

Franci您可以在第二段中进一步说明javascript如何验证调用Ajax API调用的javascript是否源于目标服务器吗?
Govind Rai

3

正如我的评论所说:

REFERER是可欺骗的,因此Google不太可能将其用作验证手段。请参阅此维基百科条目。

我的猜测是Google可能使用呼叫者的IP地址以及DNS查找。DNS并非真的是可欺骗的,因为您的DNS条目必须正确才能使网站连到您。

但是,即使那样也有问题,因为如果服务器使用循环IP地址DNS设置,则在执行DNS查找时,Google将被重定向到其他IP地址。

从常见问题

请注意,只有使用此地址访问该网站时,才会接受http://www.mygooglemapssite.com/的密钥。如果通过IP地址(例如http://10.1.2.3/)或使用DNS CNAME记录别名为www.mygooglemapssite.com的主机名访问该站点,则该站点将不被接受。

我的猜测是,它可能正在使用Host请求页面时发送的标头,这通常会像Google要求您将其API脚本直接包含到页面中那样工作。然后,该脚本可以访问当前页面的标题,并可以使用它进行检查。

我的猜测得到了支持,因为它不适用于IP地址或别名,这意味着它没有在进行DNS检查。

此方法不能被欺骗,因为它必须是访问页面的正确标题。但是,这意味着该域的任何别名将不起作用。

但是,这也意味着您必须提供一个Javascript库来访问代码,因为我不能检查此服务器端。


请求页面时,“主机”标头可能包含地址,但是如何保证该值也传递到该页面向我的API发出的新AJAX请求中?我认为这基本上是“引荐来源网址”中包含的内容,我们知道这些内容可以被欺骗。
Vyrotek

好吧,因为您正在编写AJAX调用(因为您提供了Javascript库),所以可以确保将其发送出去。
泰勒·卡特

Google之所以需要API密钥是因为它们提供了Javascript库,然后可以在页面上运行Javascript。
泰勒·卡特

1
是的,但是任何人都可以看到加载到客户端上的代码,并进行修改以发送所需的任何域URL。因此它仍然不安全。
Vyrotek

5
这个答案是不正确的。正如Arjan所说的那样,用于调用google API的Host标头将设置为“ google.com”,因此无论如何都不会使用。IP地址是客户端(运行Web浏览器的计算机)的IP地址。也没用。来自浏览器的唯一有用的标头是引荐来源网址,该网址提供了浏览器正在查看的网站。浏览器是否始终可靠地发送此信息?否。坏人可以破坏单个浏览器来发送其他引荐来源吗?是。坏人可以制作一个指示所有浏览器执行此操作的网站吗?否。因此它可用作跟踪信息。
哈里·伍德

3

我同意弗朗西·佩诺夫列出的所有观点我想详细说明使用其他人的API密钥。让我们假设你注册key1使用example.com

  1. 首次尝试–如果anothersite.com<script src="http://www.google.com/jsapi?key=key1">,则Google可以检查其引荐来源网址(提到的哈希方案),在这种情况下不匹配。既然很多人提到引荐来源网址可以被欺骗,那么邪恶的攻击者如何克服这一问题?这在这里并不真正适用。当然,如果发出请求,则可以发送任意标头,但是邪恶的黑客如何欺骗用户anothersite.com?通常这并不容易。IE 6上存在旧版本的Flash,允许攻击者在进行跨域请求时设置任意标头,但通常这不适用于script src。我不确定所包含的Javascript是否document.location对此进行了任何验证以防止出现这种情况(可能不是)。

  2. 第二次尝试–邪恶的攻击者从mysite.com的页面源中复制API密钥的Google Javascript ,然后在上嵌入经过修改的javascript anothersite.com。现在,Google无法检查任何内容(远程IP将是用户的计算机,您或Google不会做很多事情)。

因此,如果您出于某种原因要对您的API密钥保密(一个原因,恶意者可以将您的密钥列入黑名单/阻止),那么就不要通过服务器将密钥嵌入客户端和代理请求中(您的应用程序代码现在具有键)。


-6

它起作用的原因是您无法使用javascript进行API调用。浏览器安全性可防止javascript发出任何请求,但不能发送到javascript源自的域的任何地方。因此,来自javascript的所有API调用都需要通过存储API密钥的服务器退回(JavaScript永远不会看到api密钥)。


2
尽管有一些解决方法(JSONP)。我不认为您无法拨打电话,只是通常无法处理退货。
Ryan Elkins'2

查看一些示例,尤其是econym.org.uk/gmap/example_map12.htm(列为一个很好的教程),看来典型的用户在编写src maps api脚本时会公开密钥。源js会覆盖页面(地图是一组img)。通过使用GDownloadUrl()下载json数据来放置标记-这仅生成XMLHttpRequest,因此返回到他的服务器。JSONP需要Google服务器的支持,对吗?
三月

4
如果这是真的,那么例如CDN托管的jQuery无法对CDN以外的任何其他域进行Ajax调用。
Arjan 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.