在同步令牌模式中,我总是在隐藏字段或URL中看到CSRF令牌。将它附加到ajax post请求的末尾并让服务器决定是否需要使用它是否安全?如果这是为什么人们不这样做?
答案 0 :(得分:0)
简短的回答是,如果请求是由其他来源发出的,那么无论你如何在同步器令牌模式中发送令牌都没关系,只要它不是由浏览器自动发送的(即它不是在一个cookie)。因此,将它附加到ajax发布请求的结尾并且#34; (虽然我不太清楚你的意思:))。
在谈论没有ajax调用的传统表单应用程序时,隐藏表单字段是最方便的方式。您只需将令牌放在每个表单的隐藏字段中,并且在客户端上没有其他任何操作,这很容易。
Ajax改变了格局,ajax调用不会自动传输令牌,你必须自动处理它。例如,使用jQuery,您可以使用beforeSend
中的$.ajaxSetup
挂钩自动将令牌添加到请求中。当请求内容类型为x-www-form-urlencoded
时,您可以将其添加为另一个表单变量,当它是带有application/json
的json请求时,您可以将其添加为json值。那是安全的,但我可以看到两个问题。
一个是令牌是"元数据"对于请求,不是业务逻辑和业务数据的一部分。此外,它是跨数据结构的一个跨领域问题,而不是特定于查询。因此,最好不要将其从数据结构中删除。
另一个问题是将令牌添加到beforeSend
中已构建的请求数据是很乏味的。你必须深入研究数据结构,找到/创建令牌的变量等等。
将它作为令牌发送要容易得多,这是人们在将令牌添加到ajax请求时主要做的事情。添加自定义请求标头(如X-CSRF-Token
或类似标头)非常常见,然后服务器端可以从那里验证令牌。