2015-07-23 4 views
0

В моем приложении rails у меня есть функция sql, которую я запускаю внутри своих классов. Функция называется «survey_loader»ActiveRecord :: Base.connection.select_all и sql injection

CREATE OR REPLACE FUNCTION survey_loader 
    a lots of sql here 
END; 
$$; 

У меня также есть некоторый фасад класс для выполнения этой функции:

# Facade class to expose db stored procedures called from ruby code 
class Procedure 
    def self.survey_result_loader(administration_ids, survey_result_set_id) 
    procedure_name = 'survey_loader' 
    params = "some params here" 

    select_all(procedure_name, params) 
    end 

    # Runs SQL function 
    def self.select_all(procedure_name, params) 
    result = ActiveRecord::Base.connection.select_all("SELECT #{procedure_name}(#{params});") 
    success?(result, procedure_name) 
    end 

    def self.success?(result, key) 
    result.first[key] == 't' ? true : false 
    end 
end 

Но этот код уязвим для SQL инъекций, поскольку PARAMS будет передаваться пользователем:

ActiveRecord::Base.connection.select_all("SELECT #{procedure_name}(#{params});") 

Как я могу переписать его, чтобы быть более безопасным?

+0

Вам нужно реорганизовать его, чтобы использовать запрос 'where' вместо' connection.select_all'. Можете ли вы добавить (на свой вопрос, а не комментарий) несколько примеров того, какие параметры вы получите, и какие запросы вы хотите сделать? –

ответ

1

Во-первых, я бы рекомендовал вам использовать следующую структуру дизайна классов для определения вашей именованной функции. Он использует Arel:

def self.survey_loader(params) 
    @survey_loader = Arel::Nodes::NamedFunction.new('survey_loader', params) 
end 

Во-вторых, у вас есть жестко закодированное имя функции в вас Procedure класс, вероятно, вы можете переписать метод self.select_all как следующее:

def self.select_all(active_record_model, params) 
    active_record_model.select(survey_loader(params)) 
end 

Где active_record_model ваш класс, для который вы собираетесь выполнить в своей хранимой процедуре.