代码之家  ›  专栏  ›  技术社区  ›  Vyrotek

谷歌地图如何保护他们的API密钥?怎么做相似的东西?

  •  72
  • Vyrotek  · 技术社区  · 16 年前

    目前,Google要求您创建一个API密钥,该密钥特定于地图将从何处提供服务的域。谷歌是如何实施的?我也想做同样的事。

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

    我一直认为这个概念是不可能实现的,但不知何故,谷歌在执行它方面做得很好。

    编辑-听起来谷歌真的没有做任何惊人的事情。他们的API很可能只是用于跟踪,并不真正保证他们的API是由拥有密钥的人使用的。

    5 回复  |  直到 8 年前
        1
  •  29
  •   Trevor    16 年前

    我很确定他们会使用引用URL来确定呼叫的来源。如果域与分配给密钥的不匹配,则是无效请求。

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

        2
  •  65
  •   Franci Penov    16 年前

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

    对于Ajax调用,它们最可能使用referer获取文档主机的域。虽然引用者可以被欺骗,但最终为了使用API,您需要让Googlejavascript在文档中执行。此时,这个javascript可以验证调用Ajax API调用的文档是否确实来自目标服务器。当然,如果您有自己的DOM实现或者对脚本进行即时修改,那么这也是一个骗局。然而,这种欺骗需要在客户端发生,并且希望使用Google API的网站能够欺骗客户端软件的可能性非常小。

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

    当然,还有一个问题是,通过API可能会有XSS攻击。但我不认为他们的API密钥与他们拥有的任何反XSS代码有太多的联系。

        3
  •  3
  •   Tyler Carter    16 年前

    正如我的评论所说:

    这个引用是假的,所以谷歌不太可能用它来验证。见 this wikipedia entry.

    我的猜测是,Google可能会将呼叫者的IP地址与DNS查找一起使用。DNS并不是真正的骗局,因为你的DNS条目必须是正确的,网站才能找到你。

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

    从常见问题谈起

    注意一把钥匙 http://www.mygooglemapssite.com/ 仅当使用此地址访问网站时才接受。如果站点是通过IP地址访问的(例如 http://10.1.2.3/ )或者使用DNS CNAME记录通过别名为www.mygooglemapssite.com的主机名。

    我猜它可能在使用 Host 请求页面时发送的标题,该标题正常工作,谷歌要求您将其API脚本直接包含在页面中。然后,该脚本可以访问当前页面的标题,并可以使用该标题进行检查。

    我的猜测是基于这样一个事实:它不适用于IP地址或别名,这意味着它不进行DNS检查。

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

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

        4
  •  2
  •   Michael come lately PhiLho    8 年前

    我同意所有的观点 that Franci Penov has listed. 我想详细介绍一下如何使用其他人的API密钥。我们假设你注册了 key1 具有 example.com .

    1. 第一次尝试–如果 anothersite.com 有 <script src="http://www.google.com/jsapi?key=key1"> ,google可以检查它的引用(上面提到的哈希方案),在这种情况下会出现不匹配。邪恶攻击者是如何克服这一点的,因为很多人都提到裁判可以被欺骗?这在这里并不适用。当然,如果您提出请求,您可以发送任意的头文件,但是邪恶的黑客如何欺骗上的用户的referer? 另一个网站 是吗?这通常不容易。IE6上有旧版本的flash,允许攻击者在进行跨域请求时设置任意头文件,但一般来说,这对脚本不可行。 src . 我不确定所包含的javascript是否对 document.location 为了防止这种情况(可能不会)。

    2. 第二次尝试-一个邪恶的攻击者从 mysite.com 的页面源,然后在 另一个网站 . 现在谷歌什么都查不到(远程IP将是用户的电脑,而且你和谷歌做不了什么)。

    因此,如果您出于某种原因想要对您的API密钥保密(一个原因是,恶意人员可能会将您的密钥列入黑名单/阻止),那么不要通过服务器将密钥嵌入到客户机和代理请求中(您的应用程序代码现在拥有该密钥)。

        5
  •  -6
  •   Jeffrey Aylesworth    16 年前

    它工作的原因是您不能用JavaScript进行API调用。浏览器安全性防止javascript在任何地方发出请求,除了来自javascript的域。因此,任何来自javascript的API调用都需要通过存储API密钥的服务器进行跳转(javascript从未看到该API密钥)。