我的代码库有一个潜在的SQL注入漏洞,我想保护它。我在我的代码库中有一些查询,我将变量放在纯文本中,如下所示:
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.rbhttps://github.com/rails/rails/commit/9d43a84f73c1b3853a91d052a462ee60eccaf957