2010-12-02 19 views
2

私はRuby/Railsアプリケーションを持っています。Ruby UTF8エンコーディングの問題

postgresqlデータベースに、名前で照会したいartistテーブルがあります。私はポルトガル人のキャラクターを持つアーティストをいくつか持っており、それらに質問するいくつかの問題を抱えています。

例えば、1つのバンドはLegiãoUrbanaと呼ばれます。私は私のアプリから文字列「レギア」で照会する場合は、私は次のparamsを取得する:私は、クエリからエラーを取得するしかし

{"action"=>"search_artist", "q"=>"legi\343", "controller"=>"home"} 

私はUTF8に変換するためにやるべきことは何

Artist.all(:conditions => "name LIKE '%#{params[:q]}%'") 

PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xe32527 

かどうにかしてこれを修正しますか?

答えて

4

私は[OK]を、それは私が興味を持ったことを変換/エンコーディングもっとだ、これはそれを

require 'iconv' 
Iconv.conv("UTF8", "LATIN1", params[:q]) 
5

クエリ文字列内のそのパラメータのエンコーディングを知る必要があります。

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フラグメントがすべて安全であることを保証する上で問題はありません。

+0

を行うかもしれないと思います。どのようにパラメータのエンコーディングを見つけるのですか?私はSQLインジェクションの問題を認識していますが、クエリの例を挙げたいだけでした。 – johnnymire

+0

うーん、Ruby 1.8.7のヒント? – johnnymire

+1

+1 "文字列補間を使用せずにSQLパラメータとしてパラメータを渡す必要があります"。 –

関連する問題