在过滤安全问题之前

时间:2013-03-13 03:02:54

标签: ruby-on-rails ruby ruby-on-rails-3

目前在我的项目中,我有办法检查用户是否具有“1”的ID,他被允许访问某些操作。我使用了devise gem进行身份验证。

这是我的代码参考

before_filter :find_xxx, :only => [:edit, :update, :destroy, :create, :new]

这是代码

  protected    
def find_xxx
  if user_signed_in? && current_user.id != 1
      redirect_to "/", :notice => "Not today"
  end
end

我看了官方的Rails文档,他们以类似的方式接近它。我想知道这是保护我的动作的安全方法,不能有人只是将表单添加到我的html中/ post到任一动作,以执行操作。

保护我的方法的最佳方法是什么。

感谢您的时间和考虑。感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

假设您已正确运行Devise身份验证,以便current_user经过身份验证,那么在提交表单之前,没有人能够通过操作表单来隐藏身份验证。

但是,您可能希望撤消过滤器中的逻辑,因为就目前而言,用户只需登录即可绕过重定向(因为user_signed_in?将为false })。如果您在访问控制器中的任何操作之前有另一个过滤器或身份验证要求强制他们登录,那么这可能就足够了。

为了安全起见,我将条件更改为:

unless user_signed_in? && current_user.id == 1

请注意,依赖这样的特定数据库ID通常不是一个好主意。你最好离开creating an admin role和/或使用像CanCan这样的宝石创建更明确的安全性。

您应该始终围绕这样的事情编写测试以确保安全。