首页 > 解决方案 > 有没有办法在不准备函数的情况下使用占位符执行查询?

问题描述

我的代码库存在我想要保护的潜在 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 必须保持关闭。有没有办法在不准备函数的情况下使用占位符执行查询?

标签: ruby-on-railspostgresqlsecurityactiverecordpgbouncer

解决方案


您可以使用 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


推荐阅读