0

我以为我在某处看到使用?转义查询来帮助防止 sql 注入攻击,但我找不到任何明确的答案。

以下 2 个查询(使用先前定义的变量)有什么区别name

People.where("name = ?", name)

People.where('name = "#{name}"')

导轨 3.2.1

红宝石 1.9.2

4

2 回答 2

0

我在Active Record Query Interface Guide上阅读了同样的内容。第 2.2 节说明了后一种方法(传递哈希):

将变量直接放入条件字符串将按原样将变量传递给数据库。这意味着它将是直接来自可能有恶意的用户的未转义变量。

这是build_where API 的链接,在Where方法中调用。当哈希被传递到方法中时,它会直接传递到数据库。当您使用前一种语法(“name = ?”,opts)时,查询会在传递选项之前进行清理。

于 2012-12-07T00:19:42.180 回答
0
 People.where("name = ?", name)

 This is secured. 

 People.where('name = "#{name}"')

 This is called sql injection and it's not secured.
于 2012-12-07T05:02:34.680 回答