如何为用户提供的查询清理这些参数?

时间:2015-10-22 15:40:24

标签: regex ruby-on-rails-3 postgresql

我看到一些Airbrake错误告诉我,我的用户在搜索PSQL认为是REGEX的事情时遇到问题,实际上它应该将其视为纯字符串。

错误是:

Parameters: {"terms"=>"P[", "id"=>"29"}
  Inventory Load (0.5ms)  SELECT name, number, id FROM "inventories" WHERE (name ~* 'P[' OR number ~* 'P[')
PG::InvalidRegularExpression: ERROR:  invalid regular expression: brackets [] not balanced
: SELECT name, number, id FROM "inventories"  WHERE (name ~* 'P[' OR number ~* 'P[')
Completed 500 Internal Server Error in 117.8ms

ActiveRecord::StatementInvalid (PG::InvalidRegularExpression: ERROR:  invalid regular expression: brackets [] not balanced
: SELECT name, number, id FROM "inventories"  WHERE (name ~* 'P[' OR number ~* 'P[')):

我的代码使用PSQL的模糊搜索来搜索整个单元格以查找字符串中的任何位置:

@inventory =
      Inventory.select("name, number, id")
        .where("name ~* :key OR number ~* :key", :key => key)
用户从UI中的搜索字段将

键传递给此方法。有人试图将库存项目存储为类似“P [akjhdfkgjhdg]'现在他们想要搜索它。他们应该能够。

为什么PSQL将其解释为REGEX?

编辑:

提交的答案标记为重复'不是我要问的。我不是问如何逃避括号。我问如何SANITIZE一个STRING(我不知道字符串中可能存在哪些字符),这样当ActiveRecord为DB创建sql时,任何字符可能会让Postgres误以为我和#39;传递一个REGEX进行消毒,以便将它们视为一个共同的字符串。

我无法想象每个符号客户可能会进入搜索字段,因此我无法想出一些疯狂的匹配器来检查事物。我想要像#sanitize_array'或者'消毒'在Ruby / Rails中,我已经尝试过在API Dock上记录的这些方法,但它们都不起作用。

0 个答案:

没有答案