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)
条件失败..
这可能是一个愚蠢的问题,但请耐心等待。
我一直在玩我正在开发的 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)
条件失败..