平凡なエンジニアの独り言 はてなブログ出張所

ピアノをこよなく愛するエセRubyistが適当に書き綴ります

Rails/MongoRecordでwhere句を設定する場合はセキュリティに気をつける必要がある

以下の記事でMongoDBとMongoRecordの紹介をしました。where句について、セキュリティの観点(スクリプトインジェクションができてしまう可能性がある)から念のため気にしておく必要があるかなと思ったことを書いておきます。

以下のようなコードがあるとしましょう。

_js = <<-EOS
function() {
  return this.hogehoge == "#{params[:hogehoge]}";
}
EOS

@hoges = HogeModel.find(:all, :conditions => {"$where" => _js})

params[:hogehoge]に「" || true || this.hogehoge == "」みたいな内容が入ってくると、以下のようなコードが出力されることになります。何が出てくるか、恐くもあり、楽しくもありますww

_js = <<-EOS
function() {
  return this.hogehoge == "" || true || this.hogehoge == "";
}
EOS

@hoges = HogeModel.find(:all, :conditions => {"$where" => _js})

ダブルクォーテーションをエスケープする必要がありそうです。JSを直接書いたりしないケースでは、RubyのハッシュからJSONに変換するはずなので、そのときにエスケープしてくれると思うので大丈夫だと思いますが、where句については気をつけましょう。

# ActiveRecordのように["hogehoge = ?", params[:hogehoge]]みたいな書き方ができるようになるといいのですが・・・。