保护Web API免受未经授权的应用程序攻击

我正在开发一个使用大量AJAX与服务器通信的网页。反过来,服务器有一个扩展的REST/JSON API,公开web客户端调用的不同操作

此网站由匿名用户和经过身份验证的用户使用。正如您可能期望的那样,由经过身份验证的用户发出的web服务调用需要身份验证,因此可以防止未经授权的用户或应用程序访问

然而,该网站有许多不需要身份验证的功能,其中一些使用匿名web服务。我正在使用的防止外部人员调用此web服务的唯一方法是使用CSRF令牌。我知道,CSRF令牌在这方面不是很有用。。。有了一些时间,您就可以知道如何使用web服务,即使它们使用CSRF令牌

当然,您可以使用验证码来防止应用程序或机器人自动使用您的web服务。然而,任何人都可以使用它

另一方面,在客户机和服务器之间共享密钥将是无用的。这是因为任何局外人都可以从网页源代码中读取它

我想使这些web服务在任何第三方应用程序中都很难调用。除了使用CSRF令牌,您还会做什么?这听起来有点愚蠢,但嘿,也许这很愚蠢,我只是在浪费时间

注意:鉴于此应用程序使用浏览器而不是“可执行文件”作为客户端,此问题与讨论无关。我不能在服务器和客户端之间使用秘密(至少据我所知)

我会采取一些措施

  • 在站点上强制使用https。自动将任何传入的http请求重定向到https请求(RequireHttps属性对此很方便)
  • 每个页面都需要(安全地,因此是https)向客户端发送一个一次性使用令牌,用于页面。客户端上运行的脚本可以将其保存在页面内存中。任何返回的请求都会发送一个哈希&盐渍反应,以及非盐渍反应。服务器可以使用保存的令牌+salt和散列重复这些步骤以确认请求。(与上文的答案非常相似)
    (值得注意的是,来自客户端的安全请求不是通过用户帐户进行身份验证的,而仅仅是通过完整页面发送的令牌。)
  • 一次性的定义可以是会话或页面加载,这取决于您的安全性和便利性偏好。令牌应该很长并且很快过期,以挫败攻击者

SSL+散列(令牌+nonce)应该足以满足您的需要

发表评论