【问题标题】:What is the best possible way to avoid the sql injection?避免sql注入的最佳方法是什么?
【发布时间】:2014-12-15 11:20:56
【问题描述】:

我正在使用 ruby​​ 1.8.7 和 rails 2.3.2

以下代码容易出现sql注入

params[:id] = "1) OR 1=1--"
User.delete_all("id = #{params[:id]}")

我的问题是通过执行以下操作将是避免 sql 注入的最佳解决方案。如果没有,那么最好的方法是什么?

User.delete_all("id = #{params[:id].to_i}")

【问题讨论】:

    标签: ruby-on-rails ruby sql-injection ruby-on-rails-2


    【解决方案1】:

    其他答案很好地回答了 Rails,如果您遵循他们的建议,它会正常工作。在更通用的设置中,当您必须自己处理此问题时,您通常可以使用正则表达式来提取预期格式的值。这对于整数 id 来说非常简单。可以这样想:

    if params[:id] =~ /(\d+)/
      safe_id = $1.to_i
      # do something with safe_id now
    end
    

    当您处理字符串和任意数据时,这会变得有点复杂。如果您必须处理此类数据,则可以使用数据库适配器可用的引用方法。在 Rails 中,这最终会被整合到一个一致的界面中:

    safe_string = ActiveRecord::Base.connection.quote(unsafe_string)
    

    对于大多数数据库系统,这将以特殊方式处理单引号和反斜杠。

    如果您不使用 Rails,则必须使用特定于数据库适配器的引用方法,但用法非常相似。

    要点:

    1. 如果您的数据具有特定格式,请使用正则表达式强制执行该格式
    2. 否则,请使用数据库适配器的引用功能使数据在查询中“安全”使用
    3. 如果您正确使用各种方法和“条件”,Rails 将为您处理大部分问题

    【讨论】:

      【解决方案2】:

      使用 rails 方法传递您的 where 选项。您始终可以对它们进行硬编码,就像您给出的示例一样,但通常的方式是:

      User.where(:id => params[:id]).delete_all
      User.where("id = ?", params[:id]).delete_all
      User.where("id = :id", :id => params[:id]).delete_all
      

      它们经过了很好的测试,如果检测到新漏洞,更新将解决问题,您的代码无需更改。

      顺便说一句,如果你只是想根据它的 id 删除 1 条记录,我会做的是:

      User.find(params[:id]).destroy

      【讨论】:

        【解决方案3】:

        怎么样:

        User.where(id: params[:id]).delete_all
        

        好吧,对不起 Rails 2.x:

        User.delete_all(["id = ?", params[:id]])
        

        Check doc

        顺便说一句,一定要使用delete_all 而不是destroy_all,前者不会触发回调。

        【讨论】:

        • 谢谢。我想这是避免sql注入的最好方法。使用 to_i 有什么缺点吗?
        • 不是特别清楚,但我也看不出这种伪验证的意义
        • 我的意思是,Rails 会为你处理这个,所以不要污染你的代码
        【解决方案4】:

        你也可以用这个

        User.delete(params[:id])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-01-12
          • 2019-08-23
          • 2010-09-07
          • 2013-06-10
          • 1970-01-01
          相关资源
          最近更新 更多