クエリ文字列内のそのパラメータのエンコーディングを知る必要があります。
Ruby 1.9には、エンコードされた文字列のサポートが含まれています。 Ruby 1.9のでは、あなたは可能性:
params[:q].encoding # Rails 3 on 1.9 generally presents strings in UTF-8
params[:q].encode('utf-8') # ask Ruby to re-encode it to UTF-8
その後、あなたは文字列補間(#{...}
構文)を行う前にUTF-8にそのエンコーディングからパラメータを変換する必要があります。
または、文字列補間を使用してではなく、のSQLパラメータとしてパラメータを渡す必要があります。
もちろん、これは、SQLで使用するテキストを正しくエンコードする方法がわからない限り、ではありません。 SQL文字列フラグメントを作成するには文字列補間を行う必要があります。パラメータを持つSQLフラグメントは、Railsですばやく簡単に処理できるため、使用する必要があります。
# Rails 2
Artist.all(:conditions => ['name like ?', "%#{params[:q]}%"])
Artist.all(:conditions => ['name like :q', { :q=> "%#{params[:q]}%" }])
# Rails 3
Artist.where('name like ?', "%#{params[:q]}")
Artist.where('name like :q', :q => "%#{params[:q]}")
SQLインジェクションはなく、他人のために、あなたには、いくつかの入力文字列の正しいSQLの断片を構築する方法で、文字列を補間し、エンコードの文字列操作を行うときに発生するセキュリティ上の問題です。パラメータを扱うことがより困難な言語/フレームワークでは、文字列補間や文字列構築(文字列補間や文字列構築が容易な場合)が可能です。入力文字列に関係なく、正しいSQLフラグメントを構築するために補間された文字列をエンコードする必要があります。 SQLインジェクションは、順序付けされたパラメータまたは名前付きパラメータ(上記の4つのサンプルを参照)を介してRailsで簡単に回避できるので、SQLフラグメントがすべて安全であることを保証する上で問題はありません。
を行うかもしれないと思います。どのようにパラメータのエンコーディングを見つけるのですか?私はSQLインジェクションの問題を認識していますが、クエリの例を挙げたいだけでした。 – johnnymire
うーん、Ruby 1.8.7のヒント? – johnnymire
+1 "文字列補間を使用せずにSQLパラメータとしてパラメータを渡す必要があります"。 –