rubyでは、ActiveRecordは更新と挿入のSQLの動的バインディングを提供しません。もちろん、生のSQLを使用できますが、接続を維持する必要があるため、以下のコードのように実行する前に、更新をエスケープしたりSQLを挿入したりする簡単な方法があるかどうかを知りたいです。 :
ActiveRecord::Base.connection.insert(sql)
gsubでコードを書くことができると思いますが、それを行う準備ができている方法があるかどうかはわかります。
rubyでは、ActiveRecordは更新と挿入のSQLの動的バインディングを提供しません。もちろん、生のSQLを使用できますが、接続を維持する必要があるため、以下のコードのように実行する前に、更新をエスケープしたりSQLを挿入したりする簡単な方法があるかどうかを知りたいです。 :
ActiveRecord::Base.connection.insert(sql)
gsubでコードを書くことができると思いますが、それを行う準備ができている方法があるかどうかはわかります。
Rails> = 3.2.5では、次のように機能します。
evil_input = '"\';%#{}\"foo'
ActiveRecord::Base.connection.quote(evil_input)
=> "'\"'';%\#{}\\\"foo'"
あなたはこれを行うことができます:
ActiveRecord::Base.send(:sanitize_sql,["select * from my_table where description='%s' and id='%s'","mal'formed", 55], "my_table")
もちろん、これはパラメータが個別にあることを意味します。それ以外で機能するかどうかはわかりませんが、試してみてください。
タイトルでは、挿入または更新の前に文字列をエスケープすることについて説明し、次にタグでSQLインジェクションについて説明しているため、何を求めているのかは明確ではありません。
挿入または更新する前にActiveRecordにコンテンツを自動的にエンコード/変更させる必要がある場合は、ActiveRecordのコールバックを確認しましたか?before_save
更新または作成を行うと、コールバックが発生します。保存する前にコンテンツを変更したい場合は、それを行うのに適した場所です。
SQLインジェクションを回避するために、「update」または「insert」ステートメントに変数を挿入する代わりにSQLパラメーターを使用する場合は、ARの変数バインディングを使用します。「条件」のセクションまで下にスクロールします。