В моем приложении 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});")
Как я могу переписать его, чтобы быть более безопасным?
Вам нужно реорганизовать его, чтобы использовать запрос 'where' вместо' connection.select_all'. Можете ли вы добавить (на свой вопрос, а не комментарий) несколько примеров того, какие параметры вы получите, и какие запросы вы хотите сделать? –