Javascript Web服务API密钥和Ajax-保护密钥

Javascript Web服务API密钥和Ajax-保护密钥,javascript,ajax,web-services,security,wcf-web-api,Javascript,Ajax,Web Services,Security,Wcf Web Api,这可能是一个通用的安全问题,但我想我会在我正在开发的领域中提出这个问题 该场景是:一个使用Api密钥验证并告诉我用户是谁的web服务(WCF web Api),前端混合使用jQuery和应用程序 一方面,流量可以是https,因此无法进行检查,但是如果我对每个用户使用相同的密钥(比如guid),并且我在这两种情况下都使用它,那么就有可能会使用它,并且有人可以模拟该用户 如果我实现了类似于OAuth的东西,那么将生成一个用户和一个每个应用程序密钥,这可能会起作用——但对于jQuery端,我仍然需要

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

该场景是:一个使用Api密钥验证并告诉我用户是谁的web服务(WCF web Api),前端混合使用jQuery和应用程序

一方面,流量可以是https,因此无法进行检查,但是如果我对每个用户使用相同的密钥(比如guid),并且我在这两种情况下都使用它,那么就有可能会使用它,并且有人可以模拟该用户

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

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

我该怎么办

  • md5或以某种方式加密密钥
  • 将密钥放入会话变量中,然后在使用ajax时检索它
  • 算了吧,没什么大不了的
  • 我相信这可能是一个常见的问题,所以欢迎任何指点

    为了更清楚地说明这一点-这是我编写的API,我正在查询它,而不是google等。因此我可以使用每会话令牌等,我只是想找出保护客户端令牌/密钥的最佳方法

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

    有关更多信息,请参阅
    (如何在.NET 4中对REST服务执行API密钥验证)

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

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

    这取决于API密钥的使用方式。像谷歌提供的API键被绑定到发起请求的站点的URL上;如果您尝试在具有备用URL的站点上使用密钥,则服务将抛出并出错,从而消除在客户端保护密钥的需要

    但是,一些基本API绑定到客户机,可以跨多个域使用,因此在本例中,我之前采用了将此API包装在服务器端代码中的做法,并对客户机如何与本地服务通信和保护服务设置了一些限制

    但是,我的总体建议是,围绕如何使用密钥对Web API施加限制,从而消除在客户端上保护密钥的复杂性和必要性。

    (我建议将本文标记为“安全性”)

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

    尽管如此,这里还是有一些事情需要您考虑:

  • 考虑不实际使用密钥,而是使用HMAC散列,例如,您在认证时立即提供的令牌

  • DOM存储可能比cookies更难使用

  • 请看一个示例安全模型。基本上,您使用的令牌只在有限的时间内有效(可能对单个IP地址有效)。这样,即使令牌被截获或克隆,它也只在短时间内有效。当然,当代币用完时,你需要小心你所做的事情;攻击者是否可以执行与代码相同的操作并获取新的有效令牌


  • 不要忽视服务器端的安全性:即使您的客户端在提交请求之前应该进行检查,也要在服务器上再次检查用户是否确实有权执行其请求。事实上,这个建议可能会消除上述大部分问题。

    我的投票将是支持#2。我的投票也将是第2位,假设代币也有到期日。这告诉我如何使用/实现API密钥,但没有回答关于保护它的问题。我仍然需要提供一些方法来告诉这个人是谁,并确认,哪一个可能仍然需要令牌?@justin schwartzenberger和其他可能访问我服务器端代码的人呢?从技术上讲,他们可以免费访问受保护的资源,除非我保护我的服务器端仅从同一个域执行绝对,每个用户可以在服务器端执行的操作和日志记录都会受到限制和检查,但我想确保告知服务器此人的信息不会被损坏。