ruby-on-rails - 有没有办法在不准备函数的情况下执行带有占位符的查询?

标签 ruby-on-rails postgresql security activerecord pgbouncer

我的代码库存在潜在的 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/

相关文章:

ruby-on-rails - 如何将列类型从整数更改为小数,小数点后有一个字母?

postgresql - 删除所有 View PostgreSQL

windows - 无法获取在 Windows 版本上运行的示例 C 函数

javascript - 在 Web 应用程序中使用客户端加密时, key 应该存储在哪里?

ruby-on-rails - 如何按最后一个 ID 字符搜索?

ruby-on-rails - 在父类中使用派生类的属性

ruby-on-rails - Rails 中非线程安全的示例

python - Django atomic select for update 不为递归调用锁定表?

security - ARM TrustZone 的安全/普通世界与操作系统的内核/用户模式还是 x86 的 Ring0/1/2/3?

asp.net - 如果我不限制文件上传到网络服务器的最大请求长度,会出现哪些安全漏洞?