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

Does the Rails Console Bypass Mass-Assignment Protection?

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

我一直在玩我正在开发的 rails 应用程序,我在控制台中(即 rails c),我决定尝试添加一个用户通过控制台到数据库。

我的 User 模型有一个 role 属性,它被排除在 UsersController 的强参数列表之外。但是,当我使用控制台时,我可以通过执行 update_attribute 来编辑新用户角色的值。这让我很担心。这是否意味着我没有正确执行强参数并且没有以某种方式保护我的用户模型免受质量分配?或者 rails 控制台是否故意绕过批量分配?这里有安全漏洞吗?

这里是控制台input/output:

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

提前致谢。

user.update_attribute("role", "admin")

与强参数无关.. 这只会生成一个 sql 查询,正如您在更新记录的控制台中看到的那样。

强参数用于限制来自 view/client 的未经允许的参数并修改您的记录。

和你的情况一样,

你的user_params不包括role,因为你是自己分配的。如果你没有这样做,在我发送的请求正文中 role: 'admin',

User.new(params)

将使用户 admin,如果 verify_recaptcha(model: @user) 条件失败..