ActiveRecordで検索 - SQLインジェクション対策
SQLインジェクションの脆弱性をなくすため、findでの検索条件の指定方法には注意が必要です。
- ×「:conditions=>"name = '" + name + "'"」のように条件を自前で作成するのは危険。
- ○「:conditions=>"name = ?", name」や「:conditions=>{:name=>name}」とすれば安全。パラメータを自動でサニタイジングしてくれます。
- ○find_by_* も安全。
データ:
mysql> select * from kittens; +----+-------+-------+------+ | id | name | color | age | +----+-------+-------+------+ | 1 | mii | gray | 1 | | 2 | tora | brown | 2 | | 3 | kuro | black | 1 | | 4 | shiro | white | 3 | +----+-------+-------+------+ 4 rows in set (0.00 sec)
サンプル:
class Kitten < ActiveRecord::Base def to_s return name end end # SQLインジェクションの脆弱性があるコード # "a' or '1'='1"なんて名前の猫はいないのにmiiが返される。 name = "a' or '1'='1" puts Kitten.find(:first, :conditions=>"name = '" + name + "'") # 以下は安全。nilが返される puts Kitten.find(:first, :conditions=>{:name=>name}) puts Kitten.find(:first, :conditions =>["name = ?", name]) # find_byも安全 puts Kitten.find_by_name(name)
出力:
mii nil nil nil