感谢您的帮助,因为我引导我进入 Ruby 和 Rails。
在ActiveRecord::Base的 Rails API 中,有一个关于条件的部分,旨在简单地介绍与 ActiveRecord 交互的语法。但是他们使用的示例包括(对我而言)非常有趣的关于 Ruby/Rails 中输入清理的入门:
class User < ActiveRecord::Base
def self.authenticate_unsafely(user_name, password)
where("user_name = '#{user_name}' AND password = '#{password}'").first
end
def self.authenticate_safely(user_name, password)
where("user_name = ? AND password = ?", user_name, password).first
end
def self.authenticate_safely_simply(user_name, password)
where(:user_name => user_name, :password => password).first
end
end
按照此示例代码,他们解释说:
“authenticate_safely 和 authenticate_safely_simply 都将在将用户名和密码插入查询之前对其进行清理,这将确保攻击者无法逃避查询并伪造登录(或更糟)。”
我完全明白这种输入净化是如何防止注入攻击的好事。鉴于没有调用特殊方法来预处理输入数据,我不明白这种隐式清理的位置和方式。各种示例方法似乎具有几乎相同的语义,但由于它们的解析方式,形式上的变化对安全性产生了巨大影响。我假设这些形式上的变化在效果上类似于在包含转义字符的字符串周围使用单引号和双引号之间的区别。但是,任何人都可以通过一般性的理解(或者更确切地说:在逻辑层面,而不是在解释器内部)来帮助我变得更聪明、更快吗?
此外,这些差异在多大程度上依赖于特定于 Rails 的构造,而不是底层的 Ruby?
谢谢!