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

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

程序只是一个用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就可以正常工作了,还没有去了解这几行代码的含义

共收到 7 条回复

帮顶等大神

这个异常信息,很明确,就是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就好了,还没细看

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