我写了两个查询做同样的事情,但控制台日志的结果不同。哪个更好?两者都可以避免 SQL
注入(inject)吗?
Order.where(user_id: current_user.id).or(Order.where(seller_id: current_user.id))
日志:
Order Load (0.3ms)
SELECT "orders".*
FROM "orders"
WHERE ("orders"."user_id" = ? OR "orders"."seller_id" = ?)
ORDER BY "orders"."created_at" DESC
[["user_id", 1], ["seller_id", 1]]
Order.where("user_id = ? OR seller_id = ?", current_user.id, current_user.id)
日志:
Order Load (0.3ms)
SELECT "orders".*
FROM "orders"
WHERE (user_id = 1 OR seller_id = 1)
ORDER BY "orders"."created_at" DESC
谢谢
最佳答案
是的,由于以下几个原因,它们在 SQL 注入(inject)方面都是安全的:
- 传递给它的变量是在 User 对象上调用
id
的结果,并且将始终是nil
或integer
并且将永远不要像1;DELETE FROM users
这样的字符串。 - 变量作为参数提供给
where
方法,这使 Rails 为您参数化或清理输入。如果你做了一些直接的字符串插值,比如User.where("name = '#{params[:search]}'")
并且最终用户提交了bla';delete from users'
那么是的,SQL 注入(inject)。
最好的选择是使用 .or
版本,它不使用任何硬编码的 SQL 代码。它只是将 ruby 代码传递给您定义的数据库适配器,并要求它将其转换为 SQL。
关于mysql - 使用 Ruby on Rails 进行安全/更好的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45717782/