2010-11-24 9 views
2

Rails 3アプリのページで、ビジネス名または都市別にクライアントを検索できる検索ボックスがあるとします。これらのハッシュ値がSQLに代入し、引用符で囲まれますこのRails 3の検索はSQLインジェクションに対して脆弱ですか?

if params[:search] 
    @clients = Client.where("clients.business_name LIKE :business_name OR clients.city = :city", :business_name => "%#{params[:search]}%", :city => params[:search]) 

:私のコントローラのindexメソッドでは、私はこれを行います。検索ボックスへの入力に引用符やその他の危険な文字が含まれていると、開発ログに次のようなエスケープ文字が表示されます。

... WHERE(clients.business_name LIKE '%Something \' DROP TABLE Foo% 」...だから

それとも

...WHERE... OR clients.city = 'Something OR 1=1') 

OR 1=1はそれだけで都市名の一致を生成しない、Railsが追加引用符の内側にあることから、そしてDROP TABLEの試みで、引用符がエスケープされているので、それは事業名にも一致しません。

これは、実際に準備されたステートメントを使用していないため、検索値が入力されずにクエリがデータベースに送信された後、検索値がデータベースに送信されて入力されます。しかしRailsはそれをしません。これは、すべてのデータベースで利用できるわけではなく、実装もさまざまだと思います。

これは何らかの形でSQLインジェクションに対してオープンですか?私はそれを見ませんが、再び、それは準備文を使用していないので、私は不思議です。 脆弱性が存在する場合、どうすればより安全に対応できますか?

答えて

5

いいえ、ここにはSQLインジェクションの脆弱性はありません。 ActiveRecordは、whereに2番目のパラメータとして渡したハッシュの値にconnection.quoteを呼び出して安全です。

考えられる唯一の潜在的なSQLインジェクションポイントは、connection.quoteに発見されていないバグがある可能性がありますが、これはほとんどありえません。

+0

多くの人がこの質問を見ており、誰も脆弱性を指摘していないので、私はこの回答を受け入れています。ありがとう!もちろん、誰かが見つけたら、私はそれを変更しなければならないでしょう。 –

関連する問題