我的代码库存在潜在的 SQL 注入(inject)漏洞,我希望对其进行保护。我的代码库中有一些查询,我将变量以纯文本形式放置,如下所示:
ActiveRecord::Base.connection.execute(
%{
SELECT ...
FROM ...
JOIN ...
WHERE ...
... model.foreign_id IN (#{array_of_ids})
GROUP BY 1;
}
)
我这样做是因为我认为不可能使用内置的 ActiveRecord 查询,因为查询很复杂(有一些更复杂的查询我们想要控制)。
我的第一个想法是使用 exec_query,但我发现我不能使用它。我在事务模式下使用 pgbouncer,因此 prepared_statements 必须保持关闭状态。有没有办法在不准备函数的情况下执行带有占位符的查询?
最佳答案
您可以使用 ActiveRecord 清理方法
ActiveRecord::Base.sanitize_sql(['? IN ?', 'foreign_key', [1, ';true=true']])
=> "'model_name.foreign_key' IN 1,';true=true'"
https://github.com/rails/rails/blame/8642c564dab37366c2ca8950b428d1aec84eb10d/activerecord/lib/active_record/sanitization.rb https://github.com/rails/rails/commit/9d43a84f73c1b3853a91d052a462ee60eccaf957
关于ruby-on-rails - 有没有办法在不准备函数的情况下执行带有占位符的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63925620/