ActionController::InvalidAuthenticityToken异常 解决办法

本文解释了Rails框架如何通过authenticity_token来防止CSRF攻击,包括其在手工编写HTML form和Ajax请求中的应用,并提供了绕过验证的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ActionController::InvalidAuthenticityToken 异常一般出现出现在手写的html form 标签和Ajax请求中,为什么会出现这个异常呢,这是从rails 2.0 开始包含的一个新功能,目的在于防止CSRF(Cross-Site Request Forgery)攻击.

 

rails 为了保证当前的请求是来自自己的请求,而不是通过其他网站伪造的请求,都会在生成的form 里加入一个隐藏的值

<input type="hidden" 
value="457a1e93c3a23ec2c67f1dc468bde6a4a5539610" 
name="authenticity_token"/>
 

生成的ajax代码:

οnsubmit="new Ajax.Updater('div', '/cotroller1/action1/1', 
{asynchronous:true, evalScripts:true, parameters:Form.serialize(this) 
+ '&authenticity_token=' 
+ encodeURIComponent('457a1e93c3a23ec2c67f1dc468bde6a4a5539610')})

 

从上面的代码里可以看出关键是要向action 传递authenticity_token这个参数和正确的值

当然如果你认为你的action确实不需要验证,那可以这么写:

 

#除了index,controller里的其他action都需要验证
protect_from_forgery :except => :index

#只有index需要验证
protect_from_forgery :only => :index
 

 

如果是在ajax里可以在服务端生成好需要传入的字符串

 

"'#{request_forgery_protection_token}='
+ encodeURIComponent('#{escape_javascript 
 form_authenticity_token}')"
 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值