安全的ActiveRecord就像查询一样

Gal*_*iss 73 ruby activerecord ruby-on-rails-4

我正在尝试编写LIKE查询.

我读到纯字符串quires不安全,但我找不到任何解释如何编写安全的LIKE Hash Query的文档.

可能吗?我应该手动防御SQL注入吗?

spi*_*ann 143

要确保您的查询字符串得到正确的清理,请使用数组或哈希查询语法来描述您的条件:

Foo.where("bar LIKE ?", "%#{query}%")
Run Code Online (Sandbox Code Playgroud)

要么:

Foo.where("bar LIKE :query", query: "%#{query}%")
Run Code Online (Sandbox Code Playgroud)

如果有可能的是,query可能包括%字符,那么你需要清理querysanitize_sql_like第一:

Foo.where("bar LIKE ?", "%#{sanitize_sql_like(query)}%")
Foo.where("bar LIKE :query", query: "%#{sanitize_sql_like(query)}%")
Run Code Online (Sandbox Code Playgroud)

  • 是的,您想在模式模板中使用 % 通配符,但该模式是使用 `query` 变量参数化的,并且在许多情况下,您希望逐字匹配 `query` 变量中的字符串,不允许 `query` 使用 LIKE 元字符。让我们举一个更现实的例子,%...%:字符串具有类似路径的结构,您尝试匹配 `/users/#{user.name}/tags/%`。现在,如果我将我的用户名设置为 `fr%d%`,我将能够观察到 `fred` 和 `frida` 的标签...... (2认同)
  • 好的,我想要的是将此问题与/sf/ask/399692121/结合使用建议`sanitize_sql_like()`。 (2认同)
  • @ BeniCherniavsky-Paskin现在我明白你来自哪里,你是对的.我更新了我的答案来解决这个问题. (2认同)

Ped*_*olo 31

使用Arel,您可以执行此安全且可移植的查询:

title = Model.arel_table[:title]
Model.where(title.matches("%#{query}%"))
Run Code Online (Sandbox Code Playgroud)


Kho*_*oga 7

对于PostgreSQL,它将是

Foo.where("bar ILIKE ?", "%#{query}%") 
Run Code Online (Sandbox Code Playgroud)