如何从params传递表名时识别SQL注入问题?

时间:2014-12-30 05:03:09

标签: ruby-on-rails ruby

我正在使用brakeman gem来识别我的 rails 项目中的sql注入问题。找到一个sql查询的中级注入问题,我从params传递表名。我该如何避免这个问题。我尝试用`(ticks)围绕表名。

以下是导致此问题的代码:

Student.find_by_sql("select * from students,#{params[:name]} where conditions")

以下是我的尝试:

Student.find_by_sql("select * from students,`#{params[:name]}` where conditions")

我正在使用ruby 1.8.7和rails 2.3.2。

3 个答案:

答案 0 :(得分:1)

不要将params插入到SQL语句中。

您应该将值拉出到变量中,并将其与白名单进行比较:

class SomeController < ApplicationController

  KNOWN_GOOD_TABLES = %w(posts records songs items)

  def index
    @table_name = params[:name]

    raise "Invalid table" unless KNOWN_GOOD_TABLES.include?(table_name)

    Student.find_by_sql("select * from students,#{@table_name} where conditions")

  end
end

答案 1 :(得分:0)

您需要使用quotequote_table_name,请参阅http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/ConnectionAdapters/Quoting.html

访问这些方法的方式取决于使用它的代码的位置。

答案 2 :(得分:0)

你可以ActiveRecord::Base.connection.quote_table_name(params[:name])