Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将数组传递给Rails where方法_Sql_Ruby On Rails_Ruby_Where - Fatal编程技术网

Sql 将数组传递给Rails where方法

Sql 将数组传递给Rails where方法,sql,ruby-on-rails,ruby,where,Sql,Ruby On Rails,Ruby,Where,所以我想动态地将过滤器参数传递给我的where方法,所以基本上我有这个 @colleges = College.where(@filter).order(@sort_by).paginate(:page => params[:page], :per_page => 20) 而@where只是一个用这个方法构建的字符串 def get_filter_parameters if params[:action] == 'index' table = 'colleges'

所以我想动态地将过滤器参数传递给我的where方法,所以基本上我有这个

@colleges = College.where(@filter).order(@sort_by).paginate(:page => params[:page], :per_page => 20)
而@where只是一个用这个方法构建的字符串

def get_filter_parameters
if params[:action] == 'index'
    table = 'colleges'
    columns = College.column_names
else
    table = 'housings'
    columns = Housing.column_names
end

filters = params.except(:controller, :action, :id, :sort_by, :order, :page, :college_id)
filter_keys = columns & filters.keys

@filter = ""
first = true

if filter_keys
    filter_keys.each do |f|
        if first
            @filter << "#{table}.#{f} = '#{filters[f]}'"
            first = false
        else
            @filter << " AND #{table}.#{f} = '#{filters[f]}'"
        end
    end
else
    @filter = "1=1"
end
这足以防止注射吗?

在此代码中:

College.where(:state => 'PA')
我们实际上是在传递一个散列对象。意思是这是等价的

filter = { :state => 'PA' }
College.where(filter)
因此,您可以构建此哈希对象而不是字符串:

table = "colleges"
field = "state"
value = "PA"

filter = {}
filter["#{table}.#{field}"] = value
filter["whatever"] = 'omg'

College.where(filter)

但是,要小心

根据这些信息的来源,通过将用户提供的字符串放入查询的字段名称中,您可能会受到SQL注入攻击。如果使用得当,Rails将清理查询中的值。但是,通常列名是由应用程序代码固定的,不需要清理。因此,这样做可能会绕过SQL注入保护层。

在此代码中:

College.where(:state => 'PA')
我们实际上是在传递一个散列对象。意思是这是等价的

filter = { :state => 'PA' }
College.where(filter)
因此,您可以构建此哈希对象而不是字符串:

table = "colleges"
field = "state"
value = "PA"

filter = {}
filter["#{table}.#{field}"] = value
filter["whatever"] = 'omg'

College.where(filter)

但是,要小心


根据这些信息的来源,通过将用户提供的字符串放入查询的字段名称中,您可能会受到SQL注入攻击。如果使用得当,Rails将清理查询中的值。但是,通常列名是由应用程序代码固定的,不需要清理。因此,这样做可能会绕过SQL注入保护层。

是的,这正是我所担心的,因为这些只是url中的参数,我猜有人可以在url中注入代码。请看,我想根据列检查筛选键,但这并不能保护值是什么。当您使用哈希表单查询时,Rails会为您保护值。也许您可以循环浏览模型上的列,并提取与这些列匹配的参数名称。这样,任何虚假的字段名都会被忽略。是的,这就是我所担心的,因为这些只是url中的参数,我猜有人可以在url中插入代码。请看,我想根据列检查筛选键,但这并不能保护值是什么。当您使用哈希表单查询时,Rails会为您保护值。也许您可以循环浏览模型上的列,并提取与这些列匹配的参数名称。这样,任何虚假的字段名都会被忽略。