我的工作是采用了大量的AJAX与服务器进行通信的网页上。 服务器,反过来,拥有广泛的REST / JSON API暴露在Web客户端调用不同的操作。
这个网站是由匿名和身份验证的用户使用。 正如你所期望的,通过认证的用户发出的Web服务调用需要身份验证,并因此免受未经授权的用户或应用程序。
然而,该网站有很多是不需要身份验证功能,而且其中的一些利用匿名Web服务。 我使用,以防止外人调用这个Web服务的唯一方法是通过使用CSRF令牌 。 我知道,CSRF令牌是不是很有用在这方面...在手的一段时间,你可以计算出,即使他们使用CSRF令牌如何使用的Web服务。
当然,你可以使用验证码,以防止应用程序或机器人从自主使用网络服务。 但是,任何人将能够使用它。
共享客户端和服务器之间的密钥,在另一边,将是无用的。 这是因为任何外人从网页源代码阅读的能力。
我想使这些Web服务一样困难援引为更多钞票给任何第三方应用程序 。 你会怎样除了使用CSRF令牌呢? 这听起来有点傻,但是,嘿,也许这是愚蠢的,我只是失去了我的时间。
注:鉴于此应用程序使用的浏览器,而不是一个“可执行文件”作为客户端, 这个问题是不相关的讨论。 我不能使用服务器和客户端之间的秘密(据我所知,至少)
我会采取几个步骤。
- 在网站上强制使用HTTPS。 自动重定向任何传入的HTTP请求到https的人(在RequireHttps属性是非常方便的这个)
- 每个页面都需要(安全,因此HTTPS)发送一个一次性使用的令牌给客户端,用于网页。 在客户端上运行的脚本,可以在页面内存中保留这一点。 回来的任何请求发送一个散列&盐腌响应,与沿随机数的盐。 该服务器可以重复使用保存的令牌+盐和哈希步骤确认的要求。 (就像上面explunit的回答)(值得一提的是从客户端安全性要求不是从用户帐户验证,仅仅用整版发出的令牌。)
- 一次性的定义既可以是会议或页面加载,取决于您的安全VS便利偏好。 令牌应该是长期的和过期的相当迅速挫败攻击。
该SSL +哈希(令牌+随机数)应该足够满足您的需求。
这是有趣的。 下面是一个疯狂的建议。 请记住,你的问题也同样疯狂。
您的网站,一旦通过浏览器打开,要生成一个长轮询连接(彗星编程)。 这将在浏览器和服务器之间唯一的会话。 当乌尔JS正在Ajax调用,通过长轮询线程发送一些象征性的(唯一令牌每次)到服务器。 让AJAX也发出同样的道理。 在服务器,获取AJAX令牌并检查您是否对你有长轮询会话类似的令牌。 如果是的话,完成请求。 任何编码器可以打破这一点。 但是,这并不容易。 机会是freeboarders甚至不会看到这些第二条彗星代码。 您可以实现彗星代码以这样的方式是不容易察觉或理解。 当他们叫乌尔服务,发送“服务不可用”的消息。 它们将被混淆。 也使彗星代码HTTPS。
您还可以检查多久即长轮询线程是开放的。 如果会议刚刚打开,你会得到一个Ajax调用向右走,你可以认为它是一个第三方呼叫。 这取决于乌尔网站流量。 如果后页面加载1秒乌尔Ajax调用发生时,你可以检查服务器端这种模式。
任何编码的公共API,将有1到2秘密检查,他们甚至不知道即使他们知道,他们可能会被所有的额外编码,他们所要做的气馁。
因为你并不需要一个二进制分发到用户,你可能比在链接的问题描述的一个更简单的问题。 即使您的应用程序是开源的,该HMAC /签名密钥(在这个问题的答案的“请求签名”部分)可通过环境/配置设置来控制。
总结:
- 该密钥是不实际的客户端和服务器之间发送。 相反,它是用来签署请求
- 确保请求包括一些独特/随机元素(CSRF的关键可能就足够了),这样对于相同的API数据两个要求是不相同的。
- 标志的密钥请求和签名附加到请求。 您链接到一个PHP的问题,但你所使用的语言,如果不明确。 在.NET中我会使用HMAC类如HMACSHA256 。
- 在API服务器端使用相同的HMAC对象,以验证请求用相同的密钥签名。
也许你可以使用计数器来跟踪对话。 仅在服务器和客户端将能够预测下一次迭代中的对话。 这样一来,我想,你可以阻止第三方应用程序(虽然只是一个想法)冒充某人。
在开始的时候,它们开始在一些迭代聊天( i=0
,例如)。
这仅仅是基于RSA的概念,也将欺诈检测你的系统上的想法。 从授权用户的风险极小但它们也可以尝试让你的web服务的匿名电话了。
对于未经授权的用户:对于每个web服务调用,生成使用RSA一段时间后,其改变的令牌说(可以被配置说30分钟)。 本的编码方式预测被最小化。 我没有听说过RSA碰撞到现在。 发送该令牌返回给用户他的浏览器会话。 为了提高安全性,我们可能要附加与RSA令牌的会话ID。 由于会话ID是唯一的新的匿名电话将需要新的会话ID。
呼叫都可以使用审核机制进行跟踪。 同时每个Web服务可以有不同的RSA的设置。 如何为欺诈检测算法会的工作本身就是一个挑战。
授权用户:每个用户应该用头挡住他的IP地址进行跟踪。 RSA的令牌原理可以应用。
该解决方案是非常模糊的,但值得考虑。