0

行数が不明なユーザー提供のCSVファイルからデータを読み取っています。行を繰り返し処理し、各行を個別にデータベースに挿入するのではなく(パフォーマンスによって多数の挿入が損なわれる可能性があります)、値を1つの文字列に連結します。

insert_values += ", (#{params[:quantity]}, #{'#{params[:name]}', '#{Time.now.to_s(:db)}')"

次に、完全なSQLクエリを作成します。

sql = "INSERT INTO `my_table` (`quantity`, `name`, `created_at`) VALUES"+insert_values

最後に、私はそれを実行します:

ActiveRecord::Base.connection.execute(sql)

悪意のあるインジェクションからデータを安全にしたいと思います。これを行うための最良の方法は何ですか?

4

3 に答える 3

1

これを行う場合は、時間をかけて、AR の基礎となる接続エスケープ メソッドを使用して、db に入るすべてのフィールドをエスケープする必要があります。そうでなければ、あなたはただトラブルを求めているだけです。

または...多くのボリュームを実行するためのものを使用しますが、それでもエスケープを処理します... https://github.com/zdennis/activerecord-import

于 2012-12-07T18:09:07.940 に答える
1

MySQLLOAD DATA INFILE構文を使用して CSV データを挿入することを検討できます。アップロード用に最適化されており、インジェクションが発生しやすいクエリ文字列を手動で作成する必要はありません。

MySQL ドキュメントへのリンクは次のとおりです。

http://dev.mysql.com/doc/refman/5.6/en/load-data.html

LOAD DATA [LOCAL] INFILE '/path/to/data.csv'
INTO table
FIELDS TERMINATED BY ',' ENCLOSED BY '' ESCAPED BY '\'
LINES TERMINATED BY '\n'

LOCALアプリ サーバーとデータベースが異なるマシン上にある場合の使用に注意してください。CSV の形式に基づいて、フィールドと行の設定を変更する必要がある場合があります。

于 2012-12-07T18:12:24.217 に答える
0

私を最終的な道に導いてくれたすべての有益なアドバイスに感謝します. 別の投稿を読んだ後、Rails組み込みメソッドsanitize_sql_arrayを利用するために、文字列を値の配列に変更することになりました。

placeholders = []
insert_values = []

csvrow.each do |row|
  placeholders << (?,?,?)
  insert_values << params[:quantity] << #{params[:name]} << {Time.now.to_s(:db)
end

query_string = "INSERT INTO `my_table` (`quantity`, `name`, `created_at`) VALUES #{placeholders.join(", ")}"] + insert_values
sql = ActiveRecord::Base.send(:sanitize_sql_array, query_string)
ActiveRecord::Base.connection.execute(sql)
于 2012-12-07T20:30:25.767 に答える