2017-01-04 6 views
0

Oracleビュー/機能にアクセスしている間、私はOracleビュー/機能を消費しているレールのコードを持っています。 これは私のコードです:制動手アナライザを実行するとRailsの制動手SQLインジェクションの警告

def run_query 
    connection.exec_query(
     "SELECT * FROM TABLE(FN_REQ(#{demo_type_param},#{demo_tid_param}}))") 
    end 

ことが可能「SQLインジェクション攻撃」を警告

、どのように私はそれを修正しますもしそうなら、私は、これが有効な警告であれば理解する必要がありますか?

これが機能&ない実際のテーブルですので、私は正しいやり方だかわからないです。 それは通常のモデルだった場合、私はちょうどこのパターンに従っているだろう:

Model.where("mycolumn1= ? AND mycolumn2= ?", demo_type_param, demo_tid_param).firsトン

答えて

2

はい、それは本当です。ほぼ毎回、変数を連結するだけのSQLクエリを作成すると、SQLインジェクションに脆弱です。一般に、SQLインジェクションは、クエリに挿入されたデータが有効なSQLのように見えるようになるたびに発生し、追加のクエリが実行される可能性があります。

唯一の解決策は、手動で適切なエスケープを適用するか、後者が好ましい解決策であると、準備されたステートメントを使用することです。 ActiveRecordの/レールによる

、あなたはRailsがデータベース上で声明を準備し、実行時にそれにパラメータを追加し、すべてが正しくエスケープされていることを確認し、保存されます、バインド直接

ここ
sql = 'SELECT * FROM TABLE(FN_REQ(?,?))' 
connection.exec_query(sql, 'my query', [demo_type_param, demo_tid_param]) 

exec_queryを使用することができますSQLインジェクションから。

+0

上記の 'my​​ query'は何を表していますか? SQL変数には既にクエリがあるので、必要なのでしょうか? – Micheal

+0

ログに追加されるプリペアドステートメントの名前です。クエリには技術的な意味はありません。 –

+0

私はエラーを取得する:ActiveRecordは:: StatementInvalid(NoMethodError:「 "ALL '" のための' 未定義のメソッド 'タイプ:文字列:SELECT * TABLE FROM(FN_REQ(、、、、、、、、???????? ?))): – Micheal

関連する問題