it-swarm.cn

如何阻止高级用户调用我的ajax函数?

我有一个使用ajax调用来执行许多功能的站点。他们让webbrowser回调一个脚本--ajax.php。虽然我使用post数据来传输数据并限制ajax脚本可以调用的命令,但实际上没有什么能阻止用户欺骗ajax调用来尝试操作站点。是否有一些防止用户欺骗电话的毯子方式?有没有办法确保ajax调用确实来自我的网站,而不是来自其他一些脚本或网站?

或者我只需要检查php脚本中的边界条件,并防止用户欺骗他们不允许做的事情,但允许他们欺骗他们被允许的地方。

12
Daniel Bingham

我认为没有办法可靠地执行此操作,因为您可能发送的任何信息都可能被欺骗,具体取决于用户的聪明程度。

如果您只是想要一个简单的人群,而不是从您的页面调用,那么您可以检查推荐人,使用cookie或添加由调用页面发送的随机隐藏字段,该字段在一定时间后过期。但如果用户真的认定,这些很容易被欺骗。

12
delete

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

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

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

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

6
DisgruntledGoat

所以你基本上想要限制ajax.php只响应AJAX请求?

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

来源

3
theycallmemorty

正如其他人指出的那样...... ajax调用只是$ _GET或$ _POST的接收者,所以我的方法一直只是将它们视为任何动作页面并过滤/消毒输入。例如,如果您对月份的期望变化很小,并且您知道它始终采用“Jan,Feb,Mar ...”格式,则可以设置预期值的数组并对其进行过滤。陷阱任何不匹配的东西,并可选择地抛出一些东西,比如“Bzzt ......感谢你的演奏...”

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

HTH

1
digit1001

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

此外,将调用ajax的页面绑定到ajax返回的数据更接近可能会有所帮助。因此,在有问题的页面上,在页面加载时,发送一个对X会话有用的会话密钥,对于每个ajax请求,您的JavaScript需要将该密钥传回或者ajax将返回失败。一旦你的页面命中X+1 ajax调用,强制用户在发送新会话之前做一些动作(可能是验证码?甚至可能是mousemovetap事件,具体取决于UA)按下电线(从原来的ajax带外)然后重新启动过程。

虽然我考虑过这个问题,但问题的一部分可能是对发送的参数进行了松散的验证。如果人们可以只使用发送的参数并获取有效数据,那么就更难做到。如何做到这一点取决于客户端发送的是什么类型的值,以及坏人通过发送错误值可以做出什么样的恶作剧。

0
artlung