我有一个网页,用户在点击按钮时获得X分。该按钮将一个AJAX请求(JQuery)发送到PHP文件,然后奖励这些点。它使用POST。
作为客户端,php文件,参数对用户可见。
用户是否可以通过创建具有相同字段的表单并发送请求来自动执行此过程?
如何避免这种类型的CSRF?甚至会话身份验证也没用。
答案 0 :(得分:2)
您应该在服务器端处理此问题,如果您确实想要防止多方投票或阻止相同的人在同一主题上多次投票。 这就是为什么真正的投票总是使用经过身份验证的用户而不是匿名投票的原因。
通过检查请求实际上是一个XmlHttpRequest(带有@Shaun Hare响应代码或您的问题注释中的链接stackoverflow问题),您最终会阻止某些CSRF,但您不会阻止来自用户的重新发布像LiveHttpHeaders'重播'之类的工具。来自客户端的一切都可以伪造,一切。
编辑 *如果它不是你评论的投票系统,问题就是一样,你需要'某事'知道用户是否第一次做这个动作,或者他是否仍然可以做这个动作。有很多不同的东西可供选择。
您可以在页面上设置令牌,在ajax请求中使用该令牌,并使此令牌无效以供以后使用服务器端使用。这是一种方式。问题是在哪里存储这些令牌服务器端(会话,缓存等)
另一种方法是在服务器端检查情况仍然是有效的情况(例如,要求更新'某事'的请求应该可以处理您可以使用当前服务器端状态验证的散列/标记/时间戳。< / p>
这是一个非常通用的问题,解决方案取决于“执行行动”的实际情况。
答案 1 :(得分:-1)
通过检查
检查它是否是php中的ajax调用$ _ SERVER ['HTTP_X_REQUESTED_WITH']