4

Rails のセキュリティについて学び始めたばかりで、ユーザーが CSV ファイルをデータベースにアップロードできるようにしながら、セキュリティの問題を回避するにはどうすればよいか考えています。Postgres の「stdin からのコピー」機能を使用して、データを CSV から一時テーブルにアップロードし、それを別のテーブルへのアップサートに使用します。これは基本的なコードです (この投稿のおかげで):

conn = ActiveRecord::Base.connection_pool.checkout
raw  = conn.raw_connection
raw.exec("COPY temp_table (col1, col2) FROM STDIN DELIMITER '|'")

# read column values from the CSV line by line in the following format:
# attributes = {column_1: 'column 1 data', column_2: 'column 2 data'}
# line = "#{attributes.values.join('|')}\n"
rc.put_copy_data line
# wrap up copy process & insert into & update primary table

列の値をサニタイズするために何ができるか、または何をすべきか疑問に思っています。Rails 3.2 と Postgres 9.2 を使用しています。

4

1 に答える 1

5

アクションは必要ありません。COPY値を SQL 構文として解釈することはありません。不適切な形式の CSV は、不適切な引用符/不適切な列数によりエラーを生成します。独自のデータを 1 行ずつ送信する場合は、1 行に改行が続く行を除外する必要が\.ありますが、それ以外の場合はむしろ安全です。

PostgreSQL はデータをまったくサニタイズしません。データを安全に処理するだけです。したがって');DROP TABLE customer;--、CSV で文字列を受け入れる場合、.csv では非常に安全ですCOPYただし、アプリケーションがデータベースからそれを読み取る場合、「ユーザーではなくデータベースから来たので安全である」と想定し、それを SQL 文字列に補間します。

同様に、PL/PgSQL 関数EXECUTEを安全でない文字列連結で使用すると、問題が発生します。offormatおよび%Ior%L指定子を使用する必要があります。 quote_literal/quote_identまたは (リテラルの場合) use を使用しますEXECUTE ... USING

これは だけに当てはまるのではなく、操作されたデータを実行し、DB から読み戻した後に安全に使用COPYできない場合も同じです。INSERT

于 2013-08-10T00:30:47.800 に答える