我正试图在Rails中获得完整的页面缓存,但是我在CSRF方面遇到了一个很大的障碍--或者仅仅是我对它的理解。我目前已经将form_authenticity_token字符串存储在一个cookie中,JS可以用它访问和重写头标记。
在生成的HTML中有两个位置可以找到标记:
( 1)头部
<meta name="csrf-token" content="[hash]">
2)在表单的隐藏输入元素中
<input type="hidden" name="authenticity_token" value="[different hash]">
如前所述,这些散列彼此是不同的(在没有启用缓存的开发模式中)。他们为什么不一样?为什么我可以删除head元标记,而不需要表单输入,并且允许请求?但是,当我删除表单输入标签并保留标题时,请求会被拒绝吗?
实际上,这意味着头部标签是无用的,不是吗?我可以将表单输入标记重写到我的cookie中的值中,就像我对头标记所做的那样,但是由于它们彼此不同,所以我对最终结果可能意味着什么持谨慎态度,特别是当涉及到整个页面缓存时。
应用程序控制器包含:
protect_from_forgery with: :exception
before_filter :csrf_cookie
def csrf_cookie
cookies['authenticity-token'.freeze] = {
value: form_authenticity_token,
expires: 1.day.from_now,
secure: (Rails.env.staging? || Rails.env.production?)
}
end发布于 2016-06-30 00:25:35
在另一个问题上浏览led me to the answer。简而言之,Rails通过将CSRF令牌自动插入到ajax请求中来帮助jQuery用户。它在元标签中寻找它。
因此,在表单中使用CSRF令牌在提交POST请求时是有用的,将其放在首位对于节省ajax请求的时间/精力/错误非常有用。
也许在这两种情况下都有它是好的,因为当没有表单时,您可能想要执行ajax请求。如果有一个表单,并且javascript被禁用,那么在标题中使用它不会对任何人有任何好处,因为它不会包含在POST请求中。
至于为什么它们是不同的,我只能猜测这与generation...but时的算法有关,这既不存在,也不存在,因为两个标记都工作。
https://stackoverflow.com/questions/36851158
复制相似问题