ruby-on-rails - 有没有办法在不准备函数的情况下使用占位符执行查询?
问题描述
我的代码库存在我想要保护的潜在 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.rb https://github.com/rails/rails/commit/9d43a84f73c1b3853a91d052a462ee60eccaf957
推荐阅读
- sas - 正确使用输入与数据线
- vue.js - 如何在运行时检查 Vue 组件的类型?
- kotlin - Kotlin 协程从启动中获得结果
- excel - Check cell value for white space or blank only
- jquery - 从 ajax 响应中获取自定义标头
- spring-cloud-netflix - How to use Service Discovery with Spring-Cloud-Config
- django - Windows 10//电子商务上的 Saleor Django SQL 错误
- javascript - CSS calc 中的数学是否比 JS 中的数学快?
- maven - 如何根据环境 pom.xml 有条件地选择特定目录
- java - 地图列表:Camel Sql 类型参考