Ruby on rails 如何在从参数传递表名时识别SQL注入问题?

Ruby on rails 如何在从参数传递表名时识别SQL注入问题?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在使用brakeman gem来确定rails项目中的sql注入问题。在sql查询中发现一个中级注入问题,我正在从参数传递表名。我如何避免这个问题。我试着用记号把桌子的名字围起来 以下是导致此问题的代码: Student.find_by_sql("select * from students,#{params[:name]} where conditions") 以下是我尝试过的: Student.find_by_sql("select * from students,`#{params[

我正在使用brakeman gem来确定rails项目中的sql注入问题。在sql查询中发现一个中级注入问题,我正在从参数传递表名。我如何避免这个问题。我试着用记号把桌子的名字围起来

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

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。

不要在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
您需要使用quote或quote_表_名称,请参阅


如何访问这些方法将取决于使用这些方法的代码所在的位置。

您可以执行ActiveRecord::Base.connection.quote_table_nameparms[:name]

您缺少一大堆……rails不是像这样使用预处理语句吗?etcUsing find_by_sql可能是一种代码气味。您能否添加一个更好的示例来说明您想要归档的内容以及需要动态归档的部分?此刻我想学生。joinsparams[:name]。在哪里。。。可能是更好的方法。我刚刚编写了一个任意代码@meager@spickerman,其中不适用于我正在使用的版本。不能这样做,表名是动态的。这是一个临时表。quote_table_name使用quote_column_name,它最终会在表名周围打勾。因此与我所尝试的没有什么不同。Brakeman仍将此检测为sql注入问题。您必须将代码中存在的漏洞与Brakeman警告的漏洞分开。刹车手并非完美无瑕,SAST也并非完美无瑕,而且往往无法检测到何时使用了有效的保护装置。在这种情况下,将不再发出警告。它并不等同于您的代码,在代码中,您手动在值周围加上反勾号,即使在简单的情况下结果是相同的。