無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

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