2017-01-31 9 views
8

У меня есть следующий код, который выполняет вид оракула следующим образом:рубин на рельсах подготовили заявление для просмотра оракула/функция

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-инъекций.

Итак, я попытался добавить подготовить заявление следующим образом:

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(?,?,?,?,?,?,?,?,?))

Это одиночные кавычки, что Мессинг его я считаю. Есть ли способ преодолеть это?

EDIT: Я попытался ответить 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\')')) 
+0

Возможно, это глупый вопрос, и это необходимо для оракула, но попытались ли вы удалить «[» и «]»? для меня похоже, что вы пытаетесь дать второе? массив, также вероятно названный переменными связывания, был бы неплохой идеей здесь: http://millarian.com/rails/quick-tip-rails-named-bind-variables/ –

+0

да, я попытался удалить [] и получил это ArgumentError : неправильное количество аргументов (11 для 3) – Micheal

+0

также я не могу использовать именованные переменные связывания, поскольку это функция оракула, и я не знаю имена столбцов. Я знаю только, какие параметры я могу пройти – Micheal

ответ

3

Глядя на 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]}))" 
) 
+0

ndn, я попробовал ваше решение, но получил ошибку. Посмотрите вверх EDIT на оригинальное сообщение внизу для ошибки. – Micheal

0

Это называется Подготовленные заявление. В файле doc вы можете найти пример, как его использовать.

+0

Я не вижу, как я могу использовать подготовленный синтаксис оператора в моем примере. – Micheal