28

这可能是一个通用的安全问题,但我想我会问我正在开发的领域。

场景是:一个 Web 服务 (WCF Web Api),它使用 API 密钥来验证并告诉我用户是谁,以及前端的 jQuery 和应用程序的混合。

一方面,流量可以是 https,因此无法对其进行检查,但是如果我对每个用户使用相同的密钥(例如 guid),并且我在两者中都使用它,那么它就有可能被盗用并且有人可以冒充用户。

如果我实现类似于 OAuth 的东西,那么会生成一个用户和一个每个应用程序的密钥,这可以工作 - 但对于 jQuery 端,我仍然需要 javascript 中的应用程序 API 密钥。

如果有人在实际计算机上并进行了查看源,这只会是一个问题。

我应该怎么办?

  1. md5或以某种方式加密密钥?
  2. 把key放在一个session变量中,然后用ajax的时候检索呢?
  3. 克服它,这不是什么大问题/问题。

我敢肯定这可能是一个常见问题 - 所以欢迎任何指针。

为了让这一点更清楚- 这是我编写的我正在查询的 API,而不是谷歌等。所以我可以按会话令牌等做,我只是想找出保护客户端的最佳方法我会使用的令牌/密钥。

我在这里有点过于谨慎,但只是用它来学习。

4

5 回答 5

18

(我建议将此帖子标记为“安全”。)

首先,你应该清楚你要保护的是什么。你能完全信任客户吗?狡猾的用户可能会在您的页面上粘贴一个 Greasemonkey 脚本,并准确调用您的 UI 调用的代码来发送请求。将所有内容隐藏在 Javascript 闭包中仅意味着您需要一个调试器;它不会使攻击成为不可能。Firebug 可以跟踪 HTTPS 请求。还要考虑一个受感染的客户端:是否安装了键盘记录器?整个系统是否秘密运行虚拟化,以便攻击者可以随时检查内存的任何部分?当您像 web 应用程序一样暴露时,安全性真的很棘手。

尽管如此,您需要考虑以下几点:

  1. 考虑不要实际使用密钥,而是使用 HMAC 散列,例如,您在身份验证时立即提供的令牌。

  2. DOM 存储可能比 cookie 更难处理。

  3. 查看Google 的 OAuth 2 实施以获取示例安全模型。基本上,您使用的令牌仅在有限的时间内有效(可能对单个 IP 地址有效)。这样即使令牌被拦截或克隆,它也只在很短的时间内有效。当然,当令牌用完时,你需要小心你的所作所为;攻击者是否可以像你的代码一样做同样的事情并获得一个新的有效令牌?

不要忽视服务器端的安全性:即使您的客户端在提交请求之前应该进行检查,如果用户确实有权执行他们所要求的操作,请再次检查服务器。事实上,这个建议可能会消除上述大部分内容。

于 2011-06-14T01:07:34.520 回答
7

这取决于 API 密钥的使用方式。Google 提供的 API 密钥与发起请求的站点的 URL 相关联;如果您尝试在具有备用 URL 的站点上使用密钥,则服务会抛出并出错,从而无需在客户端保护密钥。

然而,一些基本的 API 与客户端相关联并且可以跨多个域使用,因此在这种情况下,我之前已经采用了将这个 API 包装在服务器端代码中的做法,并对客户端如何与本地服务进行通信设置了一些限制并保护服务。

然而,我的总体建议是对 Web API 应用关于如何使用密钥的限制,从而消除尝试在客户端保护它们的复杂性和必要性。

于 2011-06-13T23:06:09.383 回答
2

通常在这种情况下,尽管您使用“AJAX”通过服务器代理请求,该服务器会验证发出请求的浏览器是否有权这样做。如果您想直接从 JavaScript 调用服务,那么您需要某种令牌系统,例如JSON Web 令牌 (JWT),如果服务位于当前域以外的某个地方,您将不得不解决跨域问题。

于 2011-06-13T23:00:16.483 回答
2

如何使用 jQuery 调用处理与 API 通信的服务器端代码。如果您使用 MVC,您可以调用一个控制器操作,该操作可以包含代码和 API 密钥来访问您的服务并将部分视图(甚至 JSON)返回到您的 UX。如果您使用 Web 表单,您可以创建一个 aspx 页面,该页面将在后面的代码中进行 API 通信,然后将内容写入响应流以供您的 UX 使用。然后,您的 UX 代码可以只包含对服务器端代码的一些 $.post() 或 $.load() 调用,并且您的 API 密钥和端点都将受到保护。

于 2011-06-13T23:01:03.200 回答
0

有关更多信息,请参见http://blogs.msdn.com/b/rjacobs/archive/2010/06/14/how-to-do-api-key-verification-for-rest-services-in-net-4.aspx信息(如何在 .NET 4 中对 REST 服务进行 API 密钥验证)

于 2011-06-10T05:32:40.867 回答