0

我有使用 oracle 视图/功能的 rails 代码。这是我的代码:

 def run_query
    connection.exec_query(
      "SELECT * FROM TABLE(FN_REQ(#{demo_type_param},#{demo_tid_param}}))")
  end

当运行 Brakeman 分析器时,它会警告可能的“sql 注入攻击”

我需要了解这是否是一个有效的警告,如果是,我该如何补救?

由于这是一个函数而不是一个实际的表,我不确定什么是正确的方法。如果它是一个普通的模型,我会遵循这个模式:

Model.where("mycolumn1= ? AND mycolumn2= ?", demo_type_param, demo_tid_param).firs

4

1 回答 1

2

是的,它是真实的。几乎每次,您从简单的连接变量构建任何SQL 查询,您都容易受到 SQL 注入的攻击。通常,每次插入到查询中的数据看起来像是有效的 SQL 并可能导致执行额外的查询时,都会发生 SQL 注入。

唯一的解决方案是手动强制执行适当的转义或使用准备好的语句,后者是首选解决方案。

使用 ActiveRecord / Rails,您可以exec_query直接使用绑定

sql = 'SELECT * FROM TABLE(FN_REQ(?,?))'
connection.exec_query(sql, 'my query', [demo_type_param, demo_tid_param])

在这里,Rails 将在数据库上准备语句并在执行时为其添加参数,确保所有内容都正确转义并从 SQL 注入中保存。

于 2017-01-04T17:56:46.533 回答