7

rubyでは、ActiveRecordは更新と挿入のSQLの動的バインディングを提供しません。もちろん、生のSQLを使用できますが、接続を維持する必要があるため、以下のコードのように実行する前に、更新をエスケープしたりSQLを挿入したりする簡単な方法があるかどうかを知りたいです。 :

ActiveRecord::Base.connection.insert(sql)

gsubでコードを書くことができると思いますが、それを行う準備ができている方法があるかどうかはわかります。

4

3 に答える 3

16

Rails> = 3.2.5では、次のように機能します。

evil_input = '"\';%#{}\"foo'
ActiveRecord::Base.connection.quote(evil_input)
=> "'\"'';%\#{}\\\"foo'"
于 2012-09-01T01:12:31.047 に答える
10

あなたはこれを行うことができます:

ActiveRecord::Base.send(:sanitize_sql,["select * from my_table where description='%s' and id='%s'","mal'formed", 55], "my_table")

もちろん、これはパラメータが個別にあることを意味します。それ以外で機能するかどうかはわかりませんが、試してみてください。

于 2010-12-24T11:51:15.477 に答える
0

タイトルでは、挿入または更新の前に文字列をエスケープすることについて説明し、次にタグでSQLインジェクションについて説明しているため、何を求めているのかは明確ではありません。

挿入または更新する前にActiveRecordにコンテンツを自動的にエンコード/変更させる必要がある場合は、ActiveRecordのコールバックを確認しましたか?before_save更新または作成を行うと、コールバックが発生します。保存する前にコンテンツを変更したい場合は、それを行うのに適した場所です。

SQLインジェクションを回避するために、「update」または「insert」ステートメントに変数を挿入する代わりにSQLパラメーターを使用する場合は、ARの変数バインディングを使用します。「条件」のセクションまで下にスクロールします。

于 2010-12-24T10:59:25.120 に答える