Ruby on rails Rails中的这段代码是否易受sqli攻击?如果是,有效载荷是多少

Ruby on rails Rails中的这段代码是否易受sqli攻击?如果是,有效载荷是多少,ruby-on-rails,ruby-on-rails-3,security,sql-injection,Ruby On Rails,Ruby On Rails 3,Security,Sql Injection,我习惯于使用PHP和Prepared语句,现在当我看到rails的以下代码时(因为我是rails的新手,不确定语法和内容),我想知道代码是否易于SQLI注入 代码段(控制器),参数q是搜索框中的值: def index query = %w(% %).join params[:q].to_s.gsub('%', '\\%').gsub('_', '\\_') @posts = Post.where("name LIKE ? OR body LIKE ?", query, quer

我习惯于使用PHP和Prepared语句,现在当我看到rails的以下代码时(因为我是rails的新手,不确定语法和内容),我想知道代码是否易于SQLI注入

代码段(控制器),参数q是搜索框中的值:

def index
    query = %w(% %).join params[:q].to_s.gsub('%', '\\%').gsub('_', '\\_')
    @posts = Post.where("name LIKE ? OR body LIKE ?", query, query).order(params[:order])
  end

谢谢

您所拥有的一切都是为了安全。如果不是,那么它就是Rails中的一个bug

。其中
接受多种格式的条件。一个是原始字符串。如果你自己建立了这条线,那么所有的赌注都输掉了,你很容易受到攻击

正如最近的一些文件所说:

请注意,从用户输入构建自己的字符串可能会暴露您的 应用于注入攻击如果操作不正确。作为 或者,建议使用以下方法之一

换句话说,所有“以下”(每种其他支持方式)的做事方式都是可以的


因此,如果您使用字符串参数以外的任何参数执行
。where
,您应该不会有问题。

您所使用的是安全的。如果不是,那么它就是Rails中的一个bug

。其中
接受多种格式的条件。一个是原始字符串。如果你自己建立了这条线,那么所有的赌注都输掉了,你很容易受到攻击

正如最近的一些文件所说:

请注意,从用户输入构建自己的字符串可能会暴露您的 应用于注入攻击如果操作不正确。作为 或者,建议使用以下方法之一

换句话说,所有“以下”(每种其他支持方式)的做事方式都是可以的


因此,如果您使用字符串参数以外的任何参数执行
.where
,您应该可以。

只要您不在
where
子句中插入,它应该是安全的。有一些SQL注入代码的好例子

只要不在
where
子句中插入,就应该是安全的。有一些SQL注入代码的好例子

参数[:q]来自一个用户,没有正确转义,这个有效负载会不会影响:1或1=1”)——?Rails做了正确的转义。如果你好奇的话,试试
Post.where(“一些坏字符串”)。到_SQL
看不到转义。现在试试
Post.where(“name like?”,“一些坏字符串”)。并查看Rails是否会转义该参数。为更清楚起见,不安全的是类似于
Post.where(“name like#{query}”)
,因为这绕过了Rails的转义。此外,为了完全彻底,在某些特殊情况下,使用
的某些方法可能会导致意外(不安全)结果。例如,@z5h感谢您提供的详细答案,这就是我要寻找的:d参数[:q]来自用户,未正确转义,此有效负载是否会影响:1或1=1”)--Rails进行正确转义。如果您好奇,请尝试
Post.where(“某个坏字符串”).to_sql
并没有转义。现在尝试
Post.where(“name like?”,“某个坏字符串”)。to_sql
并查看Rails确实转义了参数。为了更清楚,不安全的是
Post.where(“name like{query}”)
,因为这绕过了Rails的逃逸。另外,为了彻底起见,在某些特殊情况下,您可以使用
,其中
的某些方法可能会导致意外的(不安全的)结果。例如,请参见,@z5h感谢您提供的详细答案,这就是我正在寻找的:d遵循它所述的链接”使用名称-值对散列的调用将被转义,数组形式可用于安全地参数化查询“。这意味着,除非您不在
where
子句中插值,否则它应该是安全的。+1这是正确的,但给出一个插值示例会很有帮助,这样就可以清楚地知道什么是不安全的,什么是安全的。在链接之后,它指出“使用名称-值对散列的调用将被转义,数组形式可用于安全参数化查询”。这意味着,除非您不在
where
子句中进行插值,否则它应该是安全的。+1这是正确的,但给出一个插值示例会很有帮助,这样就可以清楚什么是不安全的,什么是安全的。