我在 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})
这种方法会有风险吗?有什么选择吗?
我在 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})
这种方法会有风险吗?有什么选择吗?
如果 ActiveRecord 继续遵守清理输入的合同,则此声明不存在任何风险。另一种选择是范围,但这实际上只是用不同的语法做同样的事情。
您可以做的一件事是设置一个定义限制的默认范围level
,然后您可以只做一个标准的find_by_id
. 但如果这是不可取的,只需正确使用语法:
Object.where(id: params[:id], level: current_user.level)
只要你让 Rails 处理你的价值观,你就没有问题。我的意思是使用用户输入从 Rails 运行 sql 命令,例如
Object.where("id = #{params[:id]} AND level <= #{current_user.level}")
将容易受到sql注入
没有风险,但它的定义方式并不容易理解。
简单的语句将起作用:
object = Object.where("id = ? AND level <= ?",{params[:id], current_user.level})