【发布时间】:2021-11-10 10:42:46
【问题描述】:
这部分代码用到了:
some_list.where("'#{@new_params[:email]}' ~~* name").any?
我尝试使用谷歌搜索,但我发现只有~ rxp 的描述,这对我来说同样不清楚(尤其是在示例中)。我之前没有使用过 Ruby,如果问题很愚蠢,请见谅。
【问题讨论】:
标签: ruby-on-rails ruby postgresql
这部分代码用到了:
some_list.where("'#{@new_params[:email]}' ~~* name").any?
我尝试使用谷歌搜索,但我发现只有~ rxp 的描述,这对我来说同样不清楚(尤其是在示例中)。我之前没有使用过 Ruby,如果问题很愚蠢,请见谅。
【问题讨论】:
标签: ruby-on-rails ruby postgresql
~~* 实际上与 Ruby 没有任何关系。其Postgres specific ILIKE operator 用于模式匹配。
此代码也是SQL injection vulnerability 的教科书示例。用户输入应该被参数化。
some_list.where("? ~~* name", @new_params[:email]).any?
这段代码也很奇怪,因为它有一个Yoda condition。通常你会写成:
some_list.where("name ~~* ?", @new_params[:email]).any?
【讨论】:
some_list.where(":name ~~* name", name: @new_params[:email]).any?
这与红宝石无关。您构造一个 sql 查询并将其传递给 #where 方法,因此它是一个 PostgreSQL 运算符。
操作符~~相当于LIKE,~~*相当于ILIKE。还有 !~~ 和 !~~* 运算符分别代表 NOT LIKE 和 NOT ILIKE。所有这些运算符都是 PostgreSQL 特定的。
这就是你传递给它的内容:
"foo@bar.com ILIKE name"
【讨论】:
where 子句中的任何字符串都将被放入 SQL 查询中,然后将其传递给数据库。所以 ~~* 语法不是 ruby,而是 SQL。我的猜测是,您将 Postgres 用作数据库,因为:
操作符~~相当于LIKE,~~*相当于ILIKE。还有 !~~ 和 !~~* 运算符分别代表 NOT LIKE 和 NOT ILIKE。所有这些运算符都是 PostgreSQL 特定的。
取自:https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-LIKE
【讨论】: