【发布时间】:2015-07-23 08:23:14
【问题描述】:
在我的 Rails 应用程序中,我有一些在我的类中运行的 sql 函数。函数名为“survey_loader”
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注入的影响,因为参数将由用户传递:
ActiveRecord::Base.connection.select_all("SELECT #{procedure_name}(#{params});")
如何重写它以更安全?
【问题讨论】:
-
您需要重构它以使用
where查询而不是connection.select_all。您能否添加(针对您的问题,而不是评论)您将获得的参数种类和您想要进行的查询种类的一些示例?
标签: sql ruby-on-rails ruby activerecord