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]]みたいな書き方ができるようになるといいのですが・・・。