如何在CSV上传期间防止SQL注入?

Mot*_*ars 3 security postgresql ruby-on-rails

我刚刚开始学习Rails的安全性,我想知道如何在允许用户将CSV文件上传到我们的数据库的同时避免安全性问题。我们正在使用Postgres的“从stdin复制”功能将CSV中的数据上传到临时表中,然后将其用于将upserts插入另一个表中。这是基本代码(由于这篇文章):

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
Run Code Online (Sandbox Code Playgroud)

我想知道我能还是应该做的消毒列值。我们正在使用Rails 3.2和Postgres 9.2。

Cra*_*ger 5

无需采取任何措施;COPY从不将值解释为SQL语法。格式错误的CSV会由于报价错误/列数错误而产生错误。如果要逐行发送自己的数据,则可能应排除包含单行\.和换行符的行,但是这样做相当安全。

PostgreSQL不会以任何方式清除数据,只是安全地处理它。因此,如果您');DROP TABLE customer;--在CSV中接受字符串,则在中非常安全COPY但是,如果您的应用程序从数据库中读取数据,则假定“因为它是来自数据库而不是用户的,所以它是安全的”,然后将其插值到SQL字符串中,您仍然会像往常那样填充。

同样,在EXECUTE不安全的字符串连接中使用不正确的PL / PgSQL函数也会造成问题。您必须使用和format%I%L指示符,使用quote_literal/ quote_ident或(对于文字)use EXECUTE ... USING

这不仅仅适用于COPY,如果您INSERT处理了一个被操纵的数据然后在从数据库读回它之后不安全地使用它,也是一样的。