【问题标题】:Sanitize MySQL data in Ruby on Rails 2在 Ruby on Rails 2 中清理 MySQL 数据
【发布时间】:2012-12-07 17:58:45
【问题描述】:

正在从用户提供的未知行数的 CSV 文件中读取数据。我遍历行,而不是单独将每一行单独插入数据库(可能会损害大量插入的性能),我将值连接成一个字符串:

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)

我想让数据免受恶意注入。最好的方法是什么?

【问题讨论】:

    标签: mysql ruby-on-rails code-injection sanitize


    【解决方案1】:

    如果您要这样做,那么您需要花时间使用 AR 的底层连接转义方法来转义进入数据库的每个字段。否则你就是自找麻烦。

    或者...使用其他用于处理大量音量的东西,但仍会为您处理转义...https://github.com/zdennis/activerecord-import

    【讨论】:

    • 不幸的是,Philip,activerecord-import 仅适用于 Rails 3。:(
    • 老鼠。然后你需要深入研究AR...connection.escape 以确保你正确地转义了所有输入。
    • 我计划明年初升级到3,会使用import。
    【解决方案2】:

    您可以考虑使用 MySQL LOAD 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 格式更改字段和行设置。

    【讨论】:

      【解决方案3】:

      感谢所有帮助我走上最后道路的有用建议。在阅读another post 之后,我最终将我的字符串更改为一个值数组以利用 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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-09
        • 1970-01-01
        • 2013-08-04
        相关资源
        最近更新 更多