sql - ruby on rails 为 oracle View /函数准备的语句

标签 sql ruby oracle ruby-on-rails-3 prepared-statement

我有以下代码执行 oracle View ,如下所示:

def run_query
    connection.exec_query(
      "SELECT * FROM TABLE(FN_REQRESP(#{type_param},
                                      #{search_type_param},
                                      #{tid_param},
                                      #{last_param},
                                      #{key_param},
                                      #{tran_id_param},
                                      #{num_param},
                                      #{start_date_param},
                                      #{end_date_param}))")
end

上述查询的输出如下:

SELECT * FROM TABLE(FN_REQRESP('ALL',
 'ALL_TRAN',
 '100007',
 '',
 '',
 '',
 '',
 TO_DATE('27-January-2017','dd-MON-yy'),
 TO_DATE('31-January-2017','dd-MON-yy'))) 

问题是上述查询存在SQL注入(inject)漏洞。

因此,我尝试添加如下准备语句:

 connection.exec_query('SELECT * FROM TABLE(FN_REQRESP(?,?,?,?,?,?,?,?,?))','myquery',[type_param,search_type_param,tid_param,last_param,key_param,tran_id_param,num_param,start_date_param,end_date_param])

我现在收到以下错误:

NoMethodError: undefined method `type' for "'ALL'":String: SELECT * FROM TABLE(FN_REQRESP(?,?,?,?,?,?,?,?,?))

我相信是单引号搞砸了。有办法克服这个问题吗?

编辑: 我尝试了 NDN 的答案和以下错误:

OCIError: ORA-00907: missing right parenthesis: SELECT * FROM TABLE(FN_REQRESP('\'ALL\'',
                                      '\'ALL_TRAN\'',
                                      '\'100007\'',
                                      '\'\'',
                                      '\'\'',
                                      '\'\'',
                                      '\'\'',
                                      'TO_DATE(\'01-February-2017\',\'dd-MON-yy\')',
                                      'TO_DATE(\'10-February-2017\',\'dd-MON-yy\')'))

最佳答案

查看the source , binds 以某种神奇的方式进行转换,您还必须传递一个命名的 prepare: true 参数。

它过去在 older versions 中也有不同的工作方式.


为了省去麻烦,您可以简单地使用#sanitize:

params = {
  type:        type_param,
  search_type: search_type_param,
  tid:         tid_param,
  last:        last_param,
  key:         key_param,
  tran_id:     tran_id_param,
  num:         num_param,
  start_date:  start_date_param,
  end_date:    end_date_param,
}

params.each do |key, param|
  params[key] = ActiveRecord::Base.sanitize(param)
end

connection.exec_query(
  "SELECT * FROM TABLE(FN_REQRESP(#{params[:type]},
                                  #{params[:search_type]},
                                  #{params[:tid]},
                                  #{params[:last]},
                                  #{params[:key]},
                                  #{params[:tran_id]},
                                  #{params[:num]},
                                  #{params[:start_date]},
                                  #{params[:end_date]}))"
)

关于sql - ruby on rails 为 oracle View /函数准备的语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41967721/

相关文章:

ruby - 使用 SSH 克隆存储库时出现 "permission denied"错误?

ruby - 不一致的 Ruby .split 行为

ruby-on-rails - rake 分贝 :seed fails with 'don' t know how to build task db. 种子'

sql - 不是单组功能,选择 MAX

java - 在数据库中增加性能 : storing more in memory,?

MySQL:如何将结果限制为另一个字段的最大值?

sql - 从自定义属性参数化 SOAP UI 中的 JDBC SQL 查询

sql - SELECT 查询因有效数字的 ORA-01722(无效数字)而失败

sql - 错误(ORA-00923 : FROM keyword not found where expected)

oracle - Oracle 中 SYS_EXTRACT_UTC() 的反函数是什么?