如何防止来自ajax的POST请求(通过firebug获得)
Posted
技术标签:
【中文标题】如何防止来自ajax的POST请求(通过firebug获得)【英文标题】:How to prevent POST requests from ajax (obtained through firebug) 【发布时间】:2011-09-30 22:50:21 【问题描述】:如何防止用户发送垃圾邮件请求?例如,通过 Ajax post 提交表单。使用萤火虫我可以看到发布请求,但我注意到这个请求可以通过右键单击它并选择“在新选项卡中打开”轻松重复我如何防止这样的事情发生?
【问题讨论】:
【参考方案1】:当有效用户登录或开始会话时,生成一个随机令牌字符串并将其放置在隐藏的表单字段中。每次有效用户发布有效帖子时,都会生成一个随机令牌字符串并将其存储在$_SESSION
中,同时还将其返回给客户端浏览器。当浏览器发出另一个 Ajax 发布请求时,它还必须发送与 $_SESSION
进行比较的令牌字符串。
这样,您只能在您的服务器之前批准的情况下发布 Ajax 帖子。它可以防止任何只知道 Ajax 处理程序 URL 的人向它发送 HTTP 请求。
【讨论】:
一切都很好,但不需要每次请求都生成令牌。每个会话 1 个令牌就足够了。 @zerkms 如果用户的流量在没有 SSL 的情况下被拦截,我认为令牌再生是针对 CSRF 的额外保险。该令牌很快就会失效,因此不可能进行长时间的会话模拟。 长期存在的 CSRF 令牌的安全性并不低。使用每个请求 1 个令牌,您会因多个选项卡而头疼。 @zerkms 同意多个标签的头痛问题。 安全性怎么样? ;-) 如果流量已被拦截且站点未使用 ssl - 那么拦截器已经有登录凭据。【参考方案2】:任何网络表单都可以通过多种方式发布。您需要做的是确保处理表单的服务器端脚本具有“忽略”垃圾邮件请求所需的逻辑。
【讨论】:
【参考方案3】:你不能可靠。但是您可以检查HTTP_X_REQUESTED_WITH
标头,它通常 与ajax 请求一起发送。但它可以被欺骗,也不能用于真正的 ajax 请求。
【讨论】:
如果它可以被欺骗 - 使用它的原因是什么? 它指示什么是 ajax 请求。迈克尔的回答是否是更好的方法,只要它是每个请求的令牌。如果不是这样,那么没有什么可以阻止用户完全按照 OP 所说的他们想要停止的方式进行操作。你是对的,使用多个标签会很痛苦,但这正是 OP 试图阻止的。 即使每次请求 1 个令牌,您或 Michael 的解决方案都无法阻止自动发布。只需实现一些客户端代码,请求页面获取新的有效令牌并发布,然后无限重复。达达以上是关于如何防止来自ajax的POST请求(通过firebug获得)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 AJAX POST 请求后解析来自服务器的 JSON 响应?
来自 ASP NET Web API 的 CORS 阻止 Ajax POST 调用 - 对预检请求的响应未通过访问控制检查