1

我在 Mac 上使用 Rails 3.2.11

我有这个工作正常的声明:

object= Object.find_by_id(params[:id])

我正在尝试向该语句添加一个条件,所以我这样做了:

object = Object.where("id = :id AND level <= :level",{:id => params[:id], :level =>     current_user.level})

这种方法会有风险吗?有什么选择吗?

4

3 回答 3

1

如果 ActiveRecord 继续遵守清理输入的合同,则此声明不存在任何风险。另一种选择是范围,但这实际上只是用不同的语法做同样的事情。

您可以做的一件事是设置一个定义限制的默认范围level,然后您可以只做一个标准的find_by_id. 但如果这是不可取的,只需正确使用语法:

Object.where(id: params[:id], level: current_user.level)
于 2013-02-08T08:05:41.870 回答
0

只要你让 Rails 处理你的价值观,你就没有问题。我的意思是使用用户输入从 Rails 运行 sql 命令,例如

Object.where("id = #{params[:id]} AND level <= #{current_user.level}")

将容易受到sql注入

于 2013-02-08T08:33:35.470 回答
0

没有风险,但它的定义方式并不容易理解。

简单的语句将起作用:

object = Object.where("id = ? AND level <= ?",{params[:id],   current_user.level})
于 2013-02-08T08:18:48.437 回答