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

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

评论

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

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

我并不是真正在问某个具体情况,而是要针对适用于许多情况的一般解决方案。如果有这样的解决方案,那似乎就没有解决办法。

#1 楼

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

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

评论


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

– Tim Post
10年7月27日在13:53



#2 楼

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

,这正是您始终要验证的原因

尚不清楚服务器端脚本在做什么以及可能出了什么问题,但是如果用户能够“操纵网站”,即使用错误数据调用脚本,然后您就做错了。

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

#3 楼

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

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



评论


很好,假设滥用者不使用ajax或伪造该HTTP标头

–亚当
10年7月28日在0:13

#4 楼

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

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

HTH

评论


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

– Danlefree
2010年11月19日3:00

#5 楼

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

此外,将调用ajax的页面与ajax返回的数据更紧密地绑定也可能会有所帮助。因此,在有问题的页面上,在页面加载时,发送一个适合X会话的会话密钥,对于每个ajax请求,您的JavaScript都需要将该密钥传递回来,否则ajax将返回失败。一旦您的页面碰到X+1 ajax调用,就强制用户执行一些操作(可能是验证码吗?甚至可能是mousemovetap事件,具体取决于UA),然后通过电线发送新的会话密钥(原始ajax的带外) ),然后重新启动该过程。

尽管我认为如此,但问题的一部分可能是对所发送参数的松懈验证。如果人们可以只使用发送的参数并获取有效数据,则将变得更加困难。如何做到这一点取决于客户端发送的是什么样的值,以及坏角色通过发送坏值会造成什么样的恶作剧。