gpt4 book ai didi

ruby-on-rails - 如何在 CSV 上传过程中防止 SQL 注入(inject)?

转载 作者:行者123 更新时间:2023-12-02 21:12:03 25 4
gpt4 key购买 nike

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

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。

最佳答案

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

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

同样,错误使用 PL/PgSQL 函数(其中 EXECUTE 与不安全的字符串连接一起使用)也会产生问题。您必须使用 format%I%L 说明符,使用 quote_literal/quote_ident,或(对于文字)使用 EXECUTE ... USING

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

关于ruby-on-rails - 如何在 CSV 上传过程中防止 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com