CSRF 同步令牌
CSRF Synchronized Token
在同步令牌模式中,我总是在隐藏字段或 URL 中看到 CSRF 令牌。将它附加到 ajax post 请求的末尾并让服务器决定是否需要使用它是否安全?如果是为什么人们不这样做?
简短的回答是,如果请求是由另一个来源发出的(即它不在曲奇饼)。所以 "attach it to the end of an ajax post request" 没问题(虽然我不太确定你的意思:))。
在谈论没有 ajax 调用的传统表单应用程序时,隐藏表单域是最方便的方法。您只需将令牌放在每个表单的隐藏字段中,客户端无需执行任何其他操作,很简单。
Ajax 改变了格局,ajax 调用不会自动传输令牌,您必须自动处理它。例如,对于 jQuery,您可以使用 $.ajaxSetup
中的 beforeSend
挂钩自动将令牌添加到请求中。当请求内容类型为 x-www-form-urlencoded
时,您可以将其作为另一个表单变量添加,当它是带有 application/json
的 json 请求时,您可以将其添加为 json价值。那将是安全的,但我可以看到两个问题。
一个是令牌是请求的一种 "metadata",而不是您的业务逻辑和业务数据的一部分。这也是您的数据结构中的一个 cross-cutting 问题,而不是特定于查询。所以最好让它远离数据结构。
另一个问题是在beforeSend
中将令牌添加到已经构造的请求数据中是繁琐的。您必须深入研究数据结构,find/cretae 令牌的变量等
将它作为令牌发送要容易得多,这就是人们在将令牌添加到 ajax 请求时最常做的事情。添加一个自定义请求 header 像 X-CSRF-Token
或类似的是很常见的,然后服务器端可以从那里验证令牌。
在同步令牌模式中,我总是在隐藏字段或 URL 中看到 CSRF 令牌。将它附加到 ajax post 请求的末尾并让服务器决定是否需要使用它是否安全?如果是为什么人们不这样做?
简短的回答是,如果请求是由另一个来源发出的(即它不在曲奇饼)。所以 "attach it to the end of an ajax post request" 没问题(虽然我不太确定你的意思:))。
在谈论没有 ajax 调用的传统表单应用程序时,隐藏表单域是最方便的方法。您只需将令牌放在每个表单的隐藏字段中,客户端无需执行任何其他操作,很简单。
Ajax 改变了格局,ajax 调用不会自动传输令牌,您必须自动处理它。例如,对于 jQuery,您可以使用 $.ajaxSetup
中的 beforeSend
挂钩自动将令牌添加到请求中。当请求内容类型为 x-www-form-urlencoded
时,您可以将其作为另一个表单变量添加,当它是带有 application/json
的 json 请求时,您可以将其添加为 json价值。那将是安全的,但我可以看到两个问题。
一个是令牌是请求的一种 "metadata",而不是您的业务逻辑和业务数据的一部分。这也是您的数据结构中的一个 cross-cutting 问题,而不是特定于查询。所以最好让它远离数据结构。
另一个问题是在beforeSend
中将令牌添加到已经构造的请求数据中是繁琐的。您必须深入研究数据结构,find/cretae 令牌的变量等
将它作为令牌发送要容易得多,这就是人们在将令牌添加到 ajax 请求时最常做的事情。添加一个自定义请求 header 像 X-CSRF-Token
或类似的是很常见的,然后服务器端可以从那里验证令牌。