2011-02-11 19 views
0

私は、動的列とテーブル名を渡してPostgresqlからデータを取得するためにRailsを使用しています。Postgresql(SQLインジェクションなし)の安全SQL動的列クエリ

シェイプファイルからインポートされたシェイプデータがテーブル名とカラム名の両方に動的なので、ActiveRecordは使用できません。 問題のような列名を避けるために、クエリで列名をダブルクォートで使用する必要があります。たとえば、「addr:city」です。生成されたSQL文の

def find_by_column_and_table(column_name, shape_table_name) 
      sql = "SELECT \"#{column_name}\" FROM \"#{shape_table_name}\" WHERE \"#{column_name}\" IS NOT NULL" 
      ActiveRecord::Base.connection.select_one(sql) 
     end 

2例は:

SELECT "place" FROM "shp_6c998258-32a6-11e0-b34b-080027997e00" 
SELECT "addr:province" FROM "shp_6c998258-32a6-11e0-b34b-080027997e00" 

私は、クエリにはSQLインジェクションがないことを確認します。

誰も私にこの問題を解決する方法を教えてもらえますか?

答えて

1

注入を防止し、クエリをスピードアップし、エラーをキャッチするには、位置パラメータまたはストアドプロシージャを使用することをお勧めします。それより少ないものはトラブルを求めています。

+0

これらはしかしSQL識別子では動作しません。ストアドプロシージャのLedgerSMBではこのようなことがたくさんありますが、Perlとplpgsqlの両方でこれを処理する方法があります。私はRubyについて知らない。 –

+0

私はルビーでこれを行うより良い方法を本当に知っていないので、これを投票していますが、pl/pgsqlでEXECUTEを使用して動的識別子をインライン化し、quote_ident(my_identifer)それらを逃れるために。 –

関連する問題