我正在使用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。
答案 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)
您需要使用quote
或quote_table_name
,请参阅http://api.rubyonrails.org/v2.3.8/classes/ActiveRecord/ConnectionAdapters/Quoting.html
访问这些方法的方式取决于使用它的代码的位置。
答案 2 :(得分:0)
你可以ActiveRecord::Base.connection.quote_table_name(params[:name])