Rails:测试并处理 ActionController::InvalidAuthenticityToken
Rails: Test against and handle ActionController::InvalidAuthenticityToken
我有一个 Rails 网络应用程序,其中包含一些用户可以用来发表评论等的表单。垃圾邮件发送者经常使用它们来创建垃圾评论。这没什么新鲜的。
有时我会收到导致 ActionController::InvalidAuthenticityToken 异常的 CSRF 黑客尝试。这种情况经常发生,我想拯救并将 user/bot 发送到 "You failed to comment" 页面。
虽然我无法自己重现错误,但事实证明这是一个棘手的异常。当要保存模型(由表单创建)但它没有捕获异常时,我首先在 #create 中进行了救援。为了做到这一点,我考虑让它覆盖整个控制器部分,但这似乎有点过头了。
我的两个问题:
有没有办法自己重新创建一个ActionController::InvalidAuthenticityToken错误,这样我就可以测试一下?
什么时候抛出异常?在.save?在 Comment.new 上?基本上,我应该把 begin/rescue?
放在哪里
谢谢!
您可以在您的控制器中解决此异常。您可以设置它的一种方法是在您的 ApplicationController 中添加救援。
class ApplicationController < ActionController::Base
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_auth_token
private
def record_not_found
render :text => "You failed to comment", :status => 422
end
end
您也可以在控制器操作中本地捕获异常。
def create
begin
# Create your comment
rescue ActionController::InvalidAuthenticityToken
# Render your last view with some error text.
end
end
如果您想测试一下,可以在操作中添加 raise ActionController::InvalidAuthenticityToken
。
我有一个 Rails 网络应用程序,其中包含一些用户可以用来发表评论等的表单。垃圾邮件发送者经常使用它们来创建垃圾评论。这没什么新鲜的。
有时我会收到导致 ActionController::InvalidAuthenticityToken 异常的 CSRF 黑客尝试。这种情况经常发生,我想拯救并将 user/bot 发送到 "You failed to comment" 页面。
虽然我无法自己重现错误,但事实证明这是一个棘手的异常。当要保存模型(由表单创建)但它没有捕获异常时,我首先在 #create 中进行了救援。为了做到这一点,我考虑让它覆盖整个控制器部分,但这似乎有点过头了。
我的两个问题:
有没有办法自己重新创建一个ActionController::InvalidAuthenticityToken错误,这样我就可以测试一下?
什么时候抛出异常?在.save?在 Comment.new 上?基本上,我应该把 begin/rescue?
放在哪里
谢谢!
您可以在您的控制器中解决此异常。您可以设置它的一种方法是在您的 ApplicationController 中添加救援。
class ApplicationController < ActionController::Base
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_auth_token
private
def record_not_found
render :text => "You failed to comment", :status => 422
end
end
您也可以在控制器操作中本地捕获异常。
def create
begin
# Create your comment
rescue ActionController::InvalidAuthenticityToken
# Render your last view with some error text.
end
end
如果您想测试一下,可以在操作中添加 raise ActionController::InvalidAuthenticityToken
。