新手问题 一个 Parino 博客,使用 chrome 登陆出现 attack prevented by Rack::Protection::AuthenticityToken,而 IE 正常

cichol · 2014年12月29日 · 最后由 cicholgricenchos 回复于 2014年12月30日 · 2877 次阅读

程序只是一个用 padrino 搭起来的非常简单的博客,使用了 Padrino Admin,代码在这个 repo,我没有修改过任何 app 的配置代码 https://github.com/CicholGricenchos/cichol_blog

在本地用 Linux 虚拟机运行良好,代码原封不动搬到 vps 上,原先也是良好的,但是不知道什么时候开始(今天发现)登陆管理页就会出现WARN - attack prevented by Rack::Protection::AuthenticityToken

我重启了服务器,重新拷贝了一份代码,问题仍然出现,考虑可能不是代码的问题,换了 IE 就登陆成功了。实际上在 config/app.rb 里禁用 csrf 保护也可以登陆成功,但是在保存文章的时候会重定向回登陆页,我暂时还没有去看 Padrino 那个权限管理模块的源码,也不知道为什么。

服务器端使用了 nginx+thin,nginx 只写了一行 proxy_pass。

这个问题是由什么产生的呢?


更新

现在可以排除 nginx 的问题(未启用仍然出错),排除 thin 的问题(使用 webrick 一样出错),排除 csrf 标签错误,排除旧 session/cookie(chrome 新建隐形窗口仍旧出错,ios5 的 safari 首次访问即出错)。

尝试用 curl 提交表单一样出现错误,问题肯定与这两个方面(本地服务器-vps,chrome-ie)都相关,浏览器端应该没有异常的可能,难道服务器还有未知的判断跨站的指标?或者客户端和 vps 的通信有问题?

使用 sinatra 和 Rack::Protection::AuthenticityToken 在 vps 上测试良好,这样的话应该就可以认定是 padrino 的问题了。

换了一个域名之后 post 可以正常工作了。。之前搞错了,并没有关闭 nginx,可能确实是 nginx 反代导致的

问题已解决,是 nginx 配置有问题,我参照网上的反代配置加了几行 proxy_set_header 就可以正常工作了,还没有去了解这几行代码的含义

帮顶等大神

这个异常信息,很明确,就是 csrf 标记对不上导致的。 你先确认下,页面的表单里面,是否藏着一个 csrf 标记。 如果有的话,估计是 session 丢失导致。 thin 有重启?有启动多个 app server? 关于 padrino 的 csrf 防范 rack 里面的 cookie 和 session

#2 楼 @chrisloong thin 重启过,server 只有一个。登陆页面都是 padrino admin 自动生成的,有 csrf 标记。 我刚才看了一下 cookie,没发现有异常的项目,chrome 新建一个隐身窗口也无法登陆,用 ios5 的 safari 试了也无法登陆。地址在http://cichol.tk/admin/,我创建一个测试账号给你看看?

#3 楼 @cicholgricenchos 写个 get 的 action,输出 session[:csrf] 看看,是否和前端的 csrf 一致。

#4 楼 @chrisloong 情况已于原帖更新

#4 楼 @chrisloong 是 nginx 反代的设置有问题。。我一开始就怀疑是 nginx,排查的时候搞错了,后来才发现,加了几行 proxy_set_header 就好了,还没细看

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册