【问题标题】:Allow only certain client(s) for AJAX requests仅允许某些客户端进行 AJAX 请求
【发布时间】:2011-03-07 19:47:14
【问题描述】:

我有一个 AJAX 密集型 Web 应用程序,其中的请求是不安全的,这意味着没有客户端标识。我不检查是否是我的应用程序在服务器上发出请求。

最近我发现有人使用我的 ajax 请求 url 创建了一个模仿我的 web 应用程序的 iPhone 应用程序。我添加了一个过滤器,通过查看用户代理字符串来丢弃来自 iPhone 的请求。这绝对是一个临时解决方案。

我如何确保请求来自我的应用程序,而不是阻止某些用户代理?如果我添加更多服务,如 FB 应用程序、Google Gadget 等,我也希望这些服务也能发出请求。

问题是我如何确保请求来自我的应用程序并丢弃其他所有内容。

【问题讨论】:

  • Ajax 安全与同步表单提交安全没有区别;尽可能使用会话和 IP 日志记录技术;在服务器端验证 IP 和会话。
  • @vPJ - 根据什么验证 IP 和会话?仍然无法知道“会话”不是 iPhone 应用程序中内置的代理。

标签: java ajax security rest ws-security


【解决方案1】:

哎呀,我会在这里走完全不同的路线。

告诉 iPhone 应用的创建者,您很乐意让他们继续付费使用您的服务。每次安装选择 0.50 美元左右。这样他们就可以在商店中以 0.99 美元的价格出售该应用程序;让 Apple 获得 30% 的提成,你也能从中分得一杯羹。

如果有人在构建应用程序时遇到了麻烦,您不妨利用它!

【讨论】:

    【解决方案2】:

    您永远无法确定它是否是您的应用程序,因为您的应用程序发送到服务器的所有内容也可以由任何其他应用程序发送。但是你可以让你的服务更难使用,而不是你的应用程序。您可以将一些密钥作为参数或 URL 的一部分发送,这些密钥会经常更改,并且必须包含在您自己的脚本中。查找和使用其他应用程序将变得非常简单,但如果这是每小时都在变化的东西,那么至少不可能编写一个始终有效的简单 AJAX 请求,而无需获取您的脚本,对其进行解析和找到密钥,在这种情况下,至少没有人会假装相信您的服务对所有人都是公开的。这几乎是你所能做的,让它使用起来更加困难和烦人。你永远无法让它成为不可能,但足够困难可能就足够了。

    【讨论】:

      【解决方案3】:

      您可以使用随响应发送下来的特殊令牌,您可以在 AJAX 调用中查找该令牌。这将确保调用者必须首先加载您的网页。但是,这仍然不能保证用户不是来自 iPhone 应用程序。该应用程序可以简单地处理相同的信息并充当代理,并且无法根据 HTTP 请求来判断这一点。

      您的网站是否定义了任何使用条款?如果是这样,您应该做的第一件事是联系 Apple 并告诉他们该应用程序违反了您的使用条款,并且您希望该应用程序被撤下。如果没有,您应该写一些使用条款,并联系应用程序的作者,通知他们更改,并要求他们关闭应用程序,或达成其他一些条款。如果一切都失败了,最好的办法就是让直接使用 AJAX 调用变得更加困难。诸如混淆和最小化 JS(以及将服务器端函数重命名为不太好命名)之类的简单事情将提高抓取数据的门槛。

      【讨论】:

      • 您有什么推荐的创建令牌的方法吗?
      • @Aravindan 上面 Spike 提到的 CSRF toekn 正是我所说的。
      【解决方案4】:

      这将很难,因为在某些时候您的服务器和应用程序需要共享一个秘密。该秘密将与应用程序一起分发,并且可供逆向工程师使用。现在,您可以为每个表单添加一个 CRSF 令牌(请参阅this wiki)。分发应用程序,然后将其确定为您的应用程序是 AFAIK 未解决的问题。

      【讨论】:

      • 出于好奇,如果这仍然是一个未解决的问题,像 GMail 这样的应用程序如何保护其 ajax 请求?
      • 他们在每个请求中放置了一个 nonce aka CSRF 令牌。服务器向浏览器发送一个随机值,浏览器在每个请求中都包含该值。那个问题就解决了。他们并没有阻止我弄清楚他们的协议并编写我自己的 GMail 客户端——AFAIK 没有解决这个问题。
      • 有趣。我如何生成随机数? MD5,SHA?有什么建议吗?
      • 客户无法预测的任何值都可以。所以随机数就可以了。大多数 Web 框架都内置了此功能,例如在 Django 中:docs.djangoproject.com/en/dev/ref/contrib/csrf .
      【解决方案5】:

      我不知道请求的性质,但如果需要对用户进行身份验证,那么您每次都需要在服务器上执行此操作。正如 Zed 指出的那样,这不会阻止其他开发人员调用您的 API。我同意你可以让它变得更加困难,所以这基本上是一场军备竞赛,这取决于阻止这个第三方应用程序运行的重要性。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-15
        • 2017-06-22
        • 2014-03-11
        相关资源
        最近更新 更多