【发布时间】:2016-11-19 18:36:37
【问题描述】:
在同步令牌模式中,我总是在隐藏字段或 URL 中看到 CSRF 令牌。将它附加到 ajax 发布请求的末尾并让服务器决定是否需要使用它是否安全?如果是这样,为什么人们不这样做?
【问题讨论】:
标签: csrf csrf-protection
在同步令牌模式中,我总是在隐藏字段或 URL 中看到 CSRF 令牌。将它附加到 ajax 发布请求的末尾并让服务器决定是否需要使用它是否安全?如果是这样,为什么人们不这样做?
【问题讨论】:
标签: csrf csrf-protection
简短的回答是,您如何在同步器令牌模式中发送令牌并不重要,只要它不是由浏览器自动发送的,如果请求是由另一个来源发出的(即它不在 cookie 中) .因此,可以“将其附加到 ajax 发布请求的末尾”(尽管我不太确定您的意思是什么 :))。
在谈论没有 ajax 调用的传统表单应用程序时,隐藏表单字段是最方便的方式。您只需将令牌放在每个表单的隐藏字段中,客户端上就没有其他事情可做,很简单。
Ajax 改变了格局,ajax 调用不会自动传输令牌,您必须自动处理它。例如,对于 jQuery,您将使用 $.ajaxSetup 中的 beforeSend 挂钩自动将令牌添加到请求中。当请求内容类型为x-www-form-urlencoded时,你可以将它添加为另一个表单变量,当它是一个带有application/json的json请求时,你可以将它添加为一个json值。那会很安全,但我可以看到两个问题。
一个是令牌是请求的一种“元数据”,而不是您的业务逻辑和业务数据的一部分。此外,它是跨数据结构的横切关注点,而不是特定于查询。所以最好把它排除在数据结构之外。
另一个问题是,将令牌添加到beforeSend 中已经构建的请求数据中很乏味。您必须深入研究数据结构,为令牌查找/创建变量等。
将它作为令牌发送要容易得多,这就是人们在将令牌添加到 ajax 请求时通常会做的事情。添加像X-CSRF-Token 或类似的自定义请求头是很常见的,然后服务器端可以从那里验证令牌。
【讨论】: