如何防止高级用户调用我的Ajax函数?


12

我有一个使用ajax调用执行许多功能的站点。他们将webbrowser调用返回给脚本-ajax.php。尽管我使用发布数据来传输数据并限制ajax脚本可以调用的命令,但实际上并没有什么可以阻止用户欺骗ajax调用来尝试操纵该站点。有没有一种总括的方式可以防止用户欺骗电话?有没有办法确保ajax调用确实来自我的网站而不来自其他脚本或网站?

还是只需要检查php脚本中的边界条件,并防止用户欺骗他们不允许做的事情,而是允许他们在允许的地方进行欺骗。


ajax调用是否完全未经身份验证?您是否为每个会话创建会话?有滥用的模式吗?问题是特定的操作还是更多地增加了网站的负载?
artlung 2010年

您能发表更多细节吗?AJAX调用在做什么?他们在操纵什么?如果在AJAX外部调用脚本会出现什么问题?
DisgruntledGoat 2010年

我并不是真正在问某个具体情况,而是在寻求适用于许多情况的通用解决方案。如果有这样的解决方案,那似乎是不可能的。
丹尼尔·宾厄姆

Answers:


12

我认为没有任何方法可以可靠地做到这一点,因为您发送的任何信息都可能被欺骗,这取决于用户的聪明程度。

如果您只是想让一群人不在您的页面上打电话,那么您可以检查引荐来源网址,使用Cookie或添加由呼叫页面发送的随机隐藏字段,该字段在特定时间后到期。但是,如果真正确定了用户,这些很容易被欺骗。


2
+1 ..就像无法阻止人们保存其浏览器显示的内容的本地副本一样。它更像是一场竞赛,看看您是否可以让他们放弃,然后再解决其他问题,然后再弄清楚。
Tim Post

6

简而言之,没有。任何人使用任何软件都可以通过GET或POST对URL进行任何请求。实际上,AJAX请求与直接加载URL确实没有什么不同,除了后者,返回的数据像网页一样显示在浏览器中。

这正是无论是否执行任何Javascript验证,都应始终在服务器上验证提交的数据的原因。

目前尚不清楚服务器端脚本在做什么以及可能出什么问题,但是如果用户能够通过用错误数据调用脚本来“操纵站点”,那么您做错了。

最好的解决方案可能是引入某种形式的身份验证。


3

因此,您基本上想将ajax.php限制为仅响应AJAX请求?

我不是php专家,但似乎可以通过检查的值来确定给定请求是来自AJAX还是“常规”浏览器请求$_SERVER['HTTP_X_REQUESTED_WITH']

资源


2
好点,假设滥用者不使用ajax或伪造该HTTP标头
Adam 2010年

1

正如其他人指出的那样... ajax调用只是$ _GET或$ _POST的接收者,所以我的方法一直是像对待任何操作页面一样对它们进行处理并过滤/清除输入。例如,如果您的期望值变化很小(例如一个月),并且您知道它始终采用“一月,二月,三月...”格式,则可以设置一个期望值数组并对其进行过滤。捕获所有不匹配的内容,并有选择地向后扔一些东西,例如“ Bzzt ...感谢您的播放...”

我想不出一个示例,其中我的Ajax脚本比表单提交需要更安全。

高温超导


+1代表“ Bzzt”-在“ Bzzt-感谢您的参与!”的背景下变得更加有趣 然后缓慢变黑为黑色,并在用户的计算机上设置了Cookie强制实施了三个小时的禁令(我确定他们会收到消息)
danlefree 2010年

0

我认为您解决方案的主要部分将是限制来自特定用户指纹的流量速率。可能是IP地址,用户代理字符串和要发送的数据的哈希。

而且,将调用ajax的页面更紧密地绑定到ajax返回的数据上可能会有帮助。因此,在有问题的页面上,页面加载时会发送一个适合X会话的会话密钥,对于每个ajax请求,您的JavaScript都需要将该密钥传递回来,否则ajax将返回失败。一旦页面碰到了X+1ajax调用,请强制用户执行一些操作(可能是验证码?甚至可能取决于UA mousemove还是类似a 或tapevent),然后再通过网络发送新的会话密钥(从原始ajax带外),然后重新启动过程。

尽管按照我的想法,可能您的问题的一部分可能是对所发送参数的松懈验证。如果人们只需要处理发送的参数并获取有效数据,那么就很难做到这一点。如何做到这一点取决于客户端发送的是什么样的值,以及坏角色通过发送坏值会造成什么样的恶作剧。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.