Rails3&4 内建的安全防御措施

Rails 有针对这件事设计出防御措施,
有两组 model API :attr_accessible 与 attr_protected。
其实也就是 白名单、黑名单设计。

把 attr_accessible 加在 model 里,
可以挡掉所有 massive assignement 传进来的值,
只开放你想让使用填写的栏位, 而 attr_protected 是完全相反地机制。
rails 3 默认是启动白名单的
config.active_record.whitelist_attributes = true

生成model的时候,会自带attr_accessible

#白名单,阻止没有在名单中的字段address
class Student < ActiveRecord::Base
  attr_accessible :age, :name, :teacher_id
end


Student.new({name: "shan", age: 14, address: "bj"})
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: address

#黑名单, 阻止出现在黑名单中的字段,age, name
class Student < ActiveRecord::Base
  attr_protected :age, :name, :teacher_id
end

Student.new({name: "shan", age: 14, address: "bj"})
ActiveModel::MassAssignmentSecurity::Error:
Can't mass-assign protected attributes: name, age

Rails 4 引入了 Strong Parameters 的机制,
Model 不再负责白名单的维护,把过滤非法属性的职责推给了Controller。

Strong Parameters机制

class Student < ActiveRecord::Base
end


#students_controller.rb
def student_params
  params.require(:student).
  permit(:name, :age, :teacher_id)
end
@student = Student.new(student_params)

permit会在控制器端过滤掉非法的参数,
而不需要进入到模型层用白名单进行处理

(rdb:1) p params
{"utf8"=>"✓",
"student"=>{"name"=>"sdf", "age"=>"12", "teacher_id"=>"3"},
"commit"=>"Create Student", "action"=>"create",
"controller"=>"students"}
(rdb:1) p params.require(:student)
{"name"=>"sdf", "age"=>"12", "teacher_id"=>"3"}
(rdb:1) p params.require(:student).permit(:name)
Unpermitted parameters: age, teacher_id
{"name"=>"sdf"}

你可能感兴趣的:(白名单,attr_protected,attr_accessible)