Google地图如何保护其API密钥? 如何做类似的东西?
目前,Google要求您创build一个API密钥,该密钥特定于要从中提供地图的域。 Google如何执行此操作? 我想要做同样的事情。
我为我的服务公开了一个API,但希望允许客户端通过javascriptembedded对API的调用,而不仅仅是从服务器。 我可以用一个随机标记来保护它,但是当然这可能很容易被任何在客户端机器上查看代码的人所欺骗。
我总是理解这个概念是不可能的,但是Google在执行方面做得很好。
编辑 – 这听起来像谷歌真的没有做任何惊人的事情。 他们的API很可能只是为了跟踪,而不是真的保证他们的API被密钥使用者所使用。
我很确定他们使用REFERER URL来确定来电的来源。 如果域名与分配给密钥的域名不匹配,则这是一个无效的请求。
举一个实际的例子,使用PHP,你可以使用$_SERVER['HTTP_REFERER']
检查域来检查引用者。 如果域匹配,则返回有效的响应。 如果没有,您可以返回401 Unauthorized或其他回应。
API密钥本身很可能是密钥关联的域的单向散列,而且只有Google API服务器知道的秘密。 它可能包含一些其他着名的(当然谷歌)信息。 当您从该域请求时,API服务器接受请求来自的域,并使用同样的方法进行散列计算并比较这两个值。
对于Ajax调用,他们很可能使用引用来获取文档主机的域。 尽pipe引用者可能被欺骗,但最终为了使用API,您需要在文档中执行Google JavaScript。 在这一点上,这个JavaScript可以validation确实调用Ajax API调用的文档源自目标服务器。 这当然也是可以欺骗的,只要你有自己的DOM实现或者对脚本进行修改即可。 但是,这种欺骗行为需要在客户端进行,希望使用Google API的网站能够欺骗客户端软件的可能性非常小。
请注意,由于API本质上是免费的,他们也可以提供对其API的匿名访问。 显然,Google的目的不是保护未经授权的访问,而是确保他们能够收集尽可能多的有关数据使用情况的数据,并能够将该使用情况与他们收集的有关目标域的其他数据相关联。 因此,我不希望API密钥validation比我上面描述的复杂得多 – 更高级方法的ROI太低。
当然,也有通过他们的API可能的XSS攻击的关注。 但是我不相信他们的API密钥与他们拥有的任何反XSS代码相关的太多。
正如我的评论所说:
REFERER是可伪造的,所以Google很可能不会将其用作validation手段。 看到这个维基百科条目。
我的猜测是Google可能使用调用者的IP地址以及DNS查找。 DNS并不是真的可以欺骗,因为你的DNS条目必须正确,才能让网站find你。
但是,即使这样也有问题,因为如果服务器使用循环IP地址DNS设置,那么在进行DNS查询时,Google将被redirect到不同的IP地址。
从常见问题
请注意,只有使用此地址访问网站时,才能接受http://www.mygooglemapssite.com/的密钥。; 如果通过IP地址(例如, http: //10.1.2.3/)访问站点,或者通过使用DNS CNAMElogging的别名为www.mygooglemapssite.com的主机名,则不会被接受。
我的猜测是,它可能使用请求页面时发送的Host
头,这将正常工作谷歌要求您将其API脚本直接包含在页面中。 然后,该脚本可以访问当前页面的标题,并可以使用它来检查。
我的猜测是由于它不适用于IP地址或别名,这意味着它没有进行DNS检查。
这个方法不能被欺骗,因为它必须是访问页面的正确标题。 但是,这意味着域的任何别名都不起作用。
然而,这也意味着你必须提供一个Javascript库来访问代码,因为你不能检查这个服务器端,我相信。
我同意Franci Penov列出的所有观点。我想详细说明使用别人的API密钥。 让我们假设你用http://mysite.com注册key1。;
1)第一次尝试 – 如果anothersite.com脚本src = http://www.google.com/jsapi?key=key1 ,谷歌可以检查引用(哈希计划提到),在这种情况下,有一个不匹配。 邪恶攻击者如何克服这一点 – 很多人都提到引用者可以被欺骗。 这并不适用于此。 如果你提出这个请求,你可以发送任意的头文件,但是邪恶的黑客如何为anothersite.com上的用户推荐引用者 – 这通常不容易。 在IE6上已经有旧版本的Flash,允许攻击者在进行跨域请求时设置任意头部,但是通常这对脚本src是不可行的。 我不确定包含的js是否对document.location进行了validation,以防止这种情况发生(可能不是)。
2)第二次尝试 – 邪恶攻击者从mysite.com页面源复制谷歌JavaScript的API的关键,然后embedded修改后的JavaScript在anothersite.com。 现在谷歌无法检查任何东西(远程IP将是用户的电脑,并没有很多你或谷歌可以做的)。
所以,如果你想出于某种原因保持你的API密钥的秘密(一个原因,恶意的人可以把你的密钥列入黑名单/阻止),那么不要通过你的服务器在客户端和代理请求中embedded密钥(你的应用程序代码现在有键)。
它的工作原理是,你不能使用JavaScript进行API调用。 浏览器安全性可以防止JavaScript向JavaScript发起的域发出请求。 正因为如此,来自JavaScript的任何API调用都需要通过存储API密钥的服务器进行反弹(api密钥从来不会被javascript看到)。