Google地图如何保护其API密钥?如何制作类似的东西?

时间:2010-02-13 02:54:25

标签: web-services api security google-maps api-key

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

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

我一直都不明白这个概念是不可能的,但谷歌在某种程度上做得很好。

编辑 - 听起来谷歌毕竟没有做过任何惊人的事情。他们的API最有可能仅用于跟踪,而不是真正保证他们的API由具有密钥的人使用。

5 个答案:

答案 0 :(得分:65)

API密钥本身很可能是与密钥关联的域的单向散列,以及只有Google API服务器知道的秘密。它可能包含其他一些众所周知的(当然是谷歌)信息。当您从该域发出请求时,API服务器将获取请求来自的域并进行相同的单向散列计算并比较这两个值。

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

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

当然,还有人担心可能通过他们的API进行XSS攻击。但我不相信他们的API密钥与他们拥有的任何反XSS代码相关联。

答案 1 :(得分:29)

我很确定他们使用REFERER URL来确定来电的来源。如果域名与分配给密钥的域名不匹配,则表示该请求无效。

对于一个实际示例,使用PHP,您可以使用$_SERVER['HTTP_REFERER']检查域以检查引用者。如果域匹配,则返回有效响应。如果没有,您可以返回401 Unauthorized或其他响应。

答案 2 :(得分:3)

正如我的评论所说:

  

REFERER是可欺骗的,因此Google可能不会将其用作验证方式。见this wikipedia entry.

我的猜测是Google可能会使用来电者的IP地址和DNS查询。 DNS并不是真的可以欺骗,因为您的DNS条目必须正确,网站才能找到您。

但是,即使这有问题,因为如果服务器使用循环IP地址DNS设置,则在进行DNS查找时,Google将被重定向到不同的IP地址。

来自FAQ

  

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

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

我的猜测支持这样的事实:它不适用于IP地址或别名,这意味着它没有进行DNS检查。

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

然而,这也意味着你必须提供一个Javascript库来访问代码,因为你不能检查这个服务器端,我相信。

答案 3 :(得分:3)

我同意所有要点that Franci Penov has listed.我想详细说明如何使用别人的API密钥。我们假设您使用key1注册example.com

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

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

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

答案 4 :(得分:-6)

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