Rails控制台是否绕过批量分配保护?

时间:2017-06-21 10:35:16

标签: ruby-on-rails ruby-on-rails-5 mass-assignment

这可能是一个愚蠢的问题,但请耐心等待。

我一直在玩我正在使用的rails应用程序,我在控制台(即rails c),我决定尝试通过以下方式将用户添加到数据库中控制台。

我的User模型具有role属性,该属性已从UsersController中的强参数列表中排除。但是,当我使用控制台时,我可以通过执行update_attribute来编辑新用户角色的值。这让我很担心。这是否意味着我没有正确地执行强制参数并且不知何故不能保护我的用户模型免受大规模分配?或者轨道控制台是否故意绕过质量分配?这里有安全漏洞吗?

这是控制台输入/输出:

2.3.1 :004 > user.update_attribute("role", "admin")
(0.1ms)  begin transaction
SQL (0.7ms)  UPDATE "users" SET "updated_at" = ?, "role" = ? WHERE  "users"."id" = ?  [["updated_at", "2017-06-21 10:25:34.134203"], ["role", "admin"], ["id", 4]]
(92.1ms)  commit transaction
=> true 

以下是UsersController的相关部分:

def create
    sleep(rand(5))    # random delay; mitigates Brute-Force attacks
    @user = User.new(user_params)

    if @user.save #&& verify_recaptcha(model: @user)
        if @user.update_attribute('role', 'user')
          @user.send_activation_email
          flash[:info] = "Please check your email to activate your account."
          redirect_to root_url

        else
          render 'new'
        end

    else
        render 'new' #Reset the signup page
    end
end

#...

#Defines which fields are permitted/required when making a new user.
def user_params
    params.require(:user).permit(:name, :email, :password, :password_confirmation)
end

提前谢谢。

1 个答案:

答案 0 :(得分:2)

  

user.update_attribute(“role”,“admin”)

它与强参数无关。 这只是生成一个sql查询,就像在控制台中看到的更新记录一样。

强参数用于限制来自视图/客户端的未经许可的参数并修改您的记录。

与你的情况一样,

您的user_params不包括role因为您自己分配了role: 'admin'。如果你没有这样做,我在请求正文中发送了User.new(params)

admin
如果verify_recaptcha(model: @user)条件失败,

会使用户 List<String> liveVideoSourceIdList=new ArrayList(){"my_filter"}; Predicate predicate=Predicates.in("myField",liveVideoSourceIdList.toArray(new String[0]));