我以为我在某处看到使用?
转义查询来帮助防止 sql 注入攻击,但我找不到任何明确的答案。
以下 2 个查询(使用先前定义的变量)有什么区别name
:
People.where("name = ?", name)
和
People.where('name = "#{name}"')
导轨 3.2.1
红宝石 1.9.2
我以为我在某处看到使用?
转义查询来帮助防止 sql 注入攻击,但我找不到任何明确的答案。
以下 2 个查询(使用先前定义的变量)有什么区别name
:
People.where("name = ?", name)
和
People.where('name = "#{name}"')
导轨 3.2.1
红宝石 1.9.2
我在Active Record Query Interface Guide上阅读了同样的内容。第 2.2 节说明了后一种方法(传递哈希):
将变量直接放入条件字符串将按原样将变量传递给数据库。这意味着它将是直接来自可能有恶意的用户的未转义变量。
这是build_where API 的链接,在Where方法中调用。当哈希被传递到方法中时,它会直接传递到数据库。当您使用前一种语法(“name = ?”,opts)时,查询会在传递选项之前进行清理。
People.where("name = ?", name)
This is secured.
People.where('name = "#{name}"')
This is called sql injection and it's not secured.