传入键值对是否也能防止 SQL 注入攻击?



我遇到了这个例子,其中没有使用绑定参数,而是将键值对传递给 heredoc。我知道这将允许用户以任何顺序输入输入,但我的问题是,如果我使用键值对而不是绑定参数,它是否仍然受到 SQL 注入攻击的保护?如果没有,有没有办法允许用户在没有任何特定排序的情况下传递输入,同时防止注入攻击?

下面是使用键值对的示例:

def self.find_by_id(id)
found_user = QuestionDatabase.instance.execute(<<-SQL, id: id)
SELECT
users.*
FROM
users
WHERE
users.id = :id
SQL
found_user.nil? ? nil : User.new(found_user)
end

下面是使用绑定参数的示例:

def self.find_by_id(id)
found_user = QuestionDatabase.instance.execute(<<-SQL, id)
SELECT
users.*
FROM
users
WHERE
users.id = ?
SQL
found_user.nil? ? nil : User.new(found_user)
end

据我所知,没有将参数传递给 heredoc 的语法。您显示的内容实际上只是将哈希作为参数传递给execute()

Ruby 允许参数是标量、数组或哈希。

require 'pp'
def execute(sql, binds)
pp binds
end
id = 123
execute('blah blah blah', id: id)
execute('blah blah blah', id)

输出:

{:id=>123}
123

它实际上并没有将id与字符串组合在一起,它只是将其作为参数传递给execute()函数。第一次,它传递一个哈希,所以你会得到关联的键值对。第二次,它只是传递一个标量。

据推测,真正的 Railsexecute()方法有一些代码来检查传递的参数是标量还是哈希,然后它从 SQL 字符串中解析命名参数占位符,如果您使用的 RDBMS 不支持命名参数,它会将它们替换为?占位符。

无论哪种方式,在SQL注入方面都是安全的。

最新更新