mysql - 使用 Ruby on Rails 进行安全/更好的 SQL 查询

标签 mysql sql ruby-on-rails ruby database

我写了两个查询做同样的事情,但控制台日志的结果不同。哪个更好?两者都可以避免 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)方面都是安全的:

  1. 传递给它的变量是在 User 对象上调用 id 的结果,并且将始终是 nilinteger 并且将永远不要像 1;DELETE FROM users 这样的字符串。
  2. 变量作为参数提供给 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/

相关文章:

MySql - 将三个表中的数据合并到一个表中

java - 不支持从 UNKNOWN 到 UNKNOWN 的转换

ruby-on-rails - Rails fields_for 里面的 fields_for

ruby-on-rails - 无法在 Prawn 中绘制边界框边框

mysql - SQL查询在多对多关系中精确匹配

mysql - 从存储过程调用php函数

php - CSV 导出脚本仅在 IE 中生成错误?

sql - mysql 警告

ruby-on-rails - Rails 3,可按链接模型对表列进行排序?

PHP SQL 语法错误(不知道为什么)