我有一个使用ajax调用执行许多功能的站点。他们将webbrowser调用返回给脚本-ajax.php。尽管我使用发布数据来传输数据并限制ajax脚本可以调用的命令,但实际上并没有什么可以阻止用户欺骗ajax调用来尝试操纵该站点。有没有一种总括的方式可以防止用户欺骗电话?有没有办法确保ajax调用确实来自我的网站而不来自其他脚本或网站?
还是只需要检查php脚本中的边界条件,并防止用户欺骗他们不允许做的事情,而是允许他们在允许的地方进行欺骗。
我有一个使用ajax调用执行许多功能的站点。他们将webbrowser调用返回给脚本-ajax.php。尽管我使用发布数据来传输数据并限制ajax脚本可以调用的命令,但实际上并没有什么可以阻止用户欺骗ajax调用来尝试操纵该站点。有没有一种总括的方式可以防止用户欺骗电话?有没有办法确保ajax调用确实来自我的网站而不来自其他脚本或网站?
还是只需要检查php脚本中的边界条件,并防止用户欺骗他们不允许做的事情,而是允许他们在允许的地方进行欺骗。
Answers:
我认为没有任何方法可以可靠地做到这一点,因为您发送的任何信息都可能被欺骗,这取决于用户的聪明程度。
如果您只是想让一群人不在您的页面上打电话,那么您可以检查引荐来源网址,使用Cookie或添加由呼叫页面发送的随机隐藏字段,该字段在特定时间后到期。但是,如果真正确定了用户,这些很容易被欺骗。
因此,您基本上想将ajax.php限制为仅响应AJAX请求?
我不是php专家,但似乎可以通过检查的值来确定给定请求是来自AJAX还是“常规”浏览器请求$_SERVER['HTTP_X_REQUESTED_WITH']
。
正如其他人指出的那样... ajax调用只是$ _GET或$ _POST的接收者,所以我的方法一直是像对待任何操作页面一样对它们进行处理并过滤/清除输入。例如,如果您的期望值变化很小(例如一个月),并且您知道它始终采用“一月,二月,三月...”格式,则可以设置一个期望值数组并对其进行过滤。捕获所有不匹配的内容,并有选择地向后扔一些东西,例如“ Bzzt ...感谢您的播放...”
我想不出一个示例,其中我的Ajax脚本比表单提交需要更安全。
高温超导
我认为您解决方案的主要部分将是限制来自特定用户指纹的流量速率。可能是IP地址,用户代理字符串和要发送的数据的哈希。
而且,将调用ajax的页面更紧密地绑定到ajax返回的数据上可能会有帮助。因此,在有问题的页面上,页面加载时会发送一个适合X
会话的会话密钥,对于每个ajax请求,您的JavaScript都需要将该密钥传递回来,否则ajax将返回失败。一旦页面碰到了X+1
ajax调用,请强制用户执行一些操作(可能是验证码?甚至可能取决于UA mousemove
还是类似a 或tap
event),然后再通过网络发送新的会话密钥(从原始ajax带外),然后重新启动过程。
尽管按照我的想法,可能您的问题的一部分可能是对所发送参数的松懈验证。如果人们只需要处理发送的参数并获取有效数据,那么就很难做到这一点。如何做到这一点取决于客户端发送的是什么样的值,以及坏角色通过发送坏值会造成什么样的恶作剧。