在过滤新的和创建操作之前?

时间:2015-04-14 16:58:36

标签: ruby-on-rails ruby ruby-on-rails-4

我有一个与安全相关的关于Rails的一般性问题。

我们假设我有一个这样的控制器:

def ProjectsController

  before_action :user_has_paid, :only => [ :new, :create ]  

  ...

  def new
    @project = Project.new
  end

  def create
    @project = current_user.projects.build(project_params)
    if @project.save
      flash[:success] = "Project saved."
      redirect_to projects_path
    else
      render :new
    end
  end

  ...

  private

    def user_has_paid
      if current_user.has_not_paid?
        flash[:notice] = "You must pay first."
        redirect_to payments_path
      end
    end

end

从安全角度来看:before_action new行动是否需要create

要保存几个SQL查询,我只想在new操作中使用它,但我想知道是否可以保存或者恶意用户是否能绕过{{1动作并创建一个项目,无需先付费。

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

从安全角度来看,您肯定希望在创建操作上使用before_action(否则恶意用户可以使用卷曲等来绕过付费)。至于您是否在新操作上拥有它将取决于所需的用户体验 - 您是否希望用户尝试请求“新”视图立即重定向(即他们甚至不会看到视图,除非他们已经付费),或者您是否希望允许用户查看该视图(并且可能只是在提交创建操作之前呈现有关需要付费的警告消息)。

从性能角度来看,除非对current_user.has_not_paid?的调用特别密集,否则我不会担心额外的查询。

答案 1 :(得分:1)

我建议对before_actionnew操作使用create。如果您为ProjectsController公开API,则不会接受POST创建项目的请求。因此,据我所知,检查这两项行动将是安全和良好的选择,不会留下任何安全漏洞进一步发展。