ruby-on-rails - Ruby on Rails : How to sanitize a string for SQL when not using find?

标签 ruby-on-rails escaping sanitize tsvector

如果可能的话,我正在尝试清理涉及用户输入的字符串,而不必求助于手动制作我自己的可能有问题的正则表达式,但是,如果这是唯一的方法,如果有人能指出我正确的方向,我也将不胜感激不太可能丢失任何东西的正则表达式。 Rails 中有许多方法可以让您输入 native SQL 命令,人们如何转义用户输入?

我问的问题很广泛,但在我的特定情况下,我正在处理 Postgres 数据库中的一列,据我所知,Rails 本身并不理解该列,即 tsvector,它包含纯文本搜索信息。 Rails 能够像字符串一样写入和读取它,但是,与字符串不同的是,当我在模型中执行诸如 vector= 之类的操作时,它似乎不会自动转义它。

例如,当我执行 model.name='::',其中 name 是一个字符串时,它工作正常。当我做 model.vector='::' 它错误:

ActiveRecord::StatementInvalid: PGError: ERROR:  syntax error in tsvector: "::"
"vectors" = E'::' WHERE "id" = 1

这似乎是由于缺少分号转义导致的问题,我可以手动设置 vector='::' 很好。

我也有一个好主意,也许我可以这样称呼:
ActiveRecord::Base.connection.execute "UPDATE medias SET vectors = ? WHERE id = 1", "::"

但是,此语法不起作用,因为原始 SQL 命令无权使用 ?标记。

这让我觉得与使用任何类型的用户输入调用 connection.execute 相同的问题,因为这一切都归结为清理字符串,但我似乎找不到任何方法来手动调用 Rails 的 SQL 字符串清理方法。任何人都可以提供任何建议吗?

最佳答案

将此方法添加到您的模型中:

class Media < ActiveRecord::Base
  def self.execute_sql(*sql_array)     
    connection.execute(send(:sanitize_sql_array, sql_array))
  end
end

现在您可以执行任何 SQL,例如:
Media.execute_sql('UPDATE medias SET vectors = ? WHERE id = 1', '::')

引用

1) sanitize_sql_array

关于ruby-on-rails - Ruby on Rails : How to sanitize a string for SQL when not using find?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2497757/

相关文章:

javascript - 在 Google Chrome 上待处理的 Ruby on Rails 请求

Oracle pl-sql 转义字符(对于 "'")

c++ - Qt - Esc 不应该关闭对话框

ruby - 清理 gem(和丝瓜络)在标签内前导冒号之前删除文本

markdown - 使用 Jeff Atwood 的示例清理 HTML

ruby-on-rails - 密码参数未包含在强参数中

ruby-on-rails - 如何从引擎中访问主要的 Rails 主应用程序 Controller ?

javascript - 从服务器向客户端发送 JSON 格式的 HTML 时,我应该转义内容吗?

javascript - 如何在angularjs中迭代一个对象?

ruby-on-rails - ActiveAdmin 如何添加没有模型的自定义 Controller