在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串

Posted

技术标签:

【中文标题】在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串【英文标题】:Safely escape strings for SQL fragments for joins, limits, selects, and so on (not conditions) on Rails 【发布时间】:2010-12-15 23:23:05 【问题描述】:

在 Ruby on Rails 中,对于条件,很容易进行 SQL 注入证明查询:

:conditions => ["title = ?", title]

标题来自外部,来自网络表单或类似的东西。

但是如果您在查询的其他部分使用 SQL 片段,例如:

:select => "\"#title\" AS title"   # I do have something like this in one instance
:joins => ["LEFT JOIN blah AS blah2 ON blah2.title = \"#title\""]

有没有办法正确地转义这些字符串?

【问题讨论】:

【参考方案1】:

通常在 Rails 中,连接是作为表示 i​​d 连接的符号(或作为二阶连接的哈希)完成的,您可以使用条件将其过滤掉。如果需要如图所示进行操作,那么可以使用 ActiveRecord 的sanitize_sql_array 来清理 SQL 字符串,如下所示:

sanitize_sql_array(["LEFT JOIN blah AS blah2 ON blah2.title = ?", @blah.title])

【讨论】:

这是一个受保护的方法。 @FelipeZavan 对于较新的 Rails 版本不再是这种情况

以上是关于在 Rails 上为连接、限制、选择等(不是条件)的 SQL 片段安全地转义字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rails 中执行 AJAX-y 条件显示/隐藏表单字段?

在 Ransack 上为 Rails 设置默认搜索参数

如何在 Amazon OpsWorks 上为 Rails 应用程序运行 Redis?

无法在生产服务器上为 websocket-rails 启动独立服务器

Rails 在连接表上加入条件

在 Ubuntu 上为 Ruby on Rails 安装 PostgreSQL