- https://github.com/rails/strong_parameters
- http://willnet.in/48
- http://lab.unicast.ne.jp/2013/06/11/rails4%E3%81%AEstrong_parameters%E8%A6%9A%E3%81%88%E6%9B%B8%E3%81%8D/
- http://blog.ohgaki.net/git-hub-rails-mass-assignment
- http://launchware.com/articles/whats-new-in-edge-scoped-mass-assignment-in-rails-3-1
- http://www.1x1.jp/blog/2012/03/mass_assignment_vulnerability_cakephp.html
- http://d.hatena.ne.jp/InoHiro/20100812/1281600786
Rails4.0で導入されたstrong_parameters、gemで入れるだけでRials3系でも動くというのを教えてもらったので試してみた
strong_parameters ?
mass_assignment脆弱性を解決する仕組み
mass_assignment脆弱性 ?
- mass_assignment
- ActiveRecordの値をハッシュで一度に設定できる機能
# こんなの
def signup
params[:user] # => {:name => “hogehoge”, :email => "fugefuge@example.com"}
@user = User.new(params[:user])
end
- Userオブジェクトがadmin属性を持っててparams[:user]に :admin => true もあると、@user.admin #=> true になっちゃって困る、これがmass_assignment脆弱性
- Rails アプリにありがちな脆弱性の一つ
- PHPでは古くから(に?)あった脆弱性らしいです
- こんなこともあったみたい
github の mass assignment 脆弱性が突かれた件
Rails3での対応
- 一般的にはモデルで対応
- 代入の許可/制限を ActiveRecord#attr_accessible/ActiveRecord#attr_protected でコントロールする
class User < ActiveRecord::Base
attr_protected :admin
end
user = User.new(:admin => true)
user.admin # nil due to attribute protection
PHPでの取り組み
- CakePHPのはなし
- SecurityComponent でフォームの改ざんを検出する
strong_parameters(Rails4)
- Rails4ではstrong_parametersによりコントローラでパラメータの検証を行う
# こうなる
def signup
params[:user] # => {:name => “hogehoge”, :email => "fugefuge@example.com"}
@user = User.new(params.require(:user).permit(:name, :email)
end
- 許可されていないパラメータが渡された場合、ActiveModel::ForbiddenAttributesエラーが発生
Rails3.2.13で使う
- 公式の README にも書いてある
1. Gemfileに追記、bundle install
gem 'strong_parameters'
2. 使用したいクラスで以下のようにモジュールをinclude
class Post < ActiveRecord::Base
include ActiveModel::ForbiddenAttributesProtection
end
- あるいは
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
3. config/application.rbに下記の設定が true になっている場合は false に変更
config/application.rb
config.active_record.whitelist_attributes = false
- セキュリティの考えとして入力段階で不正なデータを取り除いた方がより安全ということらしいので、コントローラで防ぐ方がモデルでやるよりもセキュアになりやすいらしい
- もちろんモデルでやるやり方でも適切にやれば何の問題もない
- より前段で防いだ方が問題が起きにくいというだけ