强参数如何阻止用户将恶意代码插入表单?

时间:2017-08-31 06:50:28

标签: ruby-on-rails ruby security

Rails新手在官方Rails指南上工作。

我不明白如何使用强参数作为安全网关,因为用户仍然可以在强参数允许的参数范围内放入恶意文本。

1 个答案:

答案 0 :(得分:2)

强参数会阻止您的模型设置不应设置的属性。

想象一下:您的模型User包含字段namerole。显然,您的用户可以更新他们的名字,但他们不应该更新他们的角色。

如果没有强参数,您的控制器可能如下所示:

class UsersController < ApplicationController
  def update
    @user.update_attributes(params[:user]) # params: {user: {role: 'administrator'}}
  end
end

用户将能够更新自己的角色并获得管理员权限。

参数很强:

class UsersController < ApplicationController
  def update
    @user.update_attributes(params_for_update) # params_for_update: {}
  end

  private

  def params_for_update
     params.require(:user).permit(:name)
  end
end

保护免受恶意参数是另一个主题。你应该消毒你的params。部分rails也可以这样做 - 例如,通过在查询方法中转义字符串:

User.where(name: "'; drop table users;").to_sql
# =>  "SELECT \"users\".* FROM \"users\" WHERE \"users\".\"name\" = '''; drop table users;'"