仅允许某些客户端处理AJAX请求

时间:2011-03-07 19:47:15

标签: java ajax security rest ws-security

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

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

如何确保请求来自我的应用程序,而不是阻止某些用户代理?如果我添加更多服务,如FB应用程序,谷歌小工具等我也希望这些也提出请求。

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

5 个答案:

答案 0 :(得分:2)

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

告诉iPhone应用程序的创建者,您会很乐意让他们继续使用您的服务,但需要付费。选择每次安装大约$ .50左右的东西。这样他们就能以0.99美元的价格在商店里销售应用程序;让苹果减少30%,你也可以获得一些交易。

如果有人为构建应用程序而烦恼,你也可以利用它!

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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