4

我刚刚开始了解 Rails 安全性,我想知道如何在允许用户将 CSV 文件上传到我们的数据库中的同时避免安全问题。我们正在使用 Postgres 的“从标准输入复制”功能将数据从 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

我想知道我可以或应该做些什么来清理列值。我们使用的是 Rails 3.2 和 Postgres 9.2。

4

1 回答 1

5

无需采取任何行动;COPY从不将值解释为 SQL 语法。由于引用错误/列数不正确,格式错误的 CSV 会产生错误。如果您逐行发送自己的数据,您可能应该排除包含单个\.后跟换行符的行,但否则它相当安全。

PostgreSQL 不会以任何方式清理数据,它只是安全地处理它。因此,如果您');DROP TABLE customer;--在 CSV 中接受一个字符串,那么它在COPY. 但是,如果您的应用程序从数据库中读取它,则假设“因为它来自数据库而不是用户,所以它是安全的”,并将其插入到 SQL 字符串中,您仍然会被塞满。

EXECUTE同样,在不安全的字符串连接中不正确使用 PL/PgSQL 函数会产生问题。您必须使用formatand the %Ior%L说明符,使用quote_literal/ quote_ident,或(对于文字)使用EXECUTE ... USING

不仅如此COPY,如果您执行INSERT操作数据然后在从数据库中读回数据后不安全地使用它,情况也是如此。

于 2013-08-10T00:30:47.800 回答