Rails6如何做XXX.Update_all '具有mysql功能



我想使用update_all来更新数据库中的所有记录。
让我假设要更新的属性的名称是price

I succeed command A.

MyModel.update_all(price: "$500")

然而,我想mysql函数(例如:IF, CONCAT, arithmetic…)
所以我尝试命令B,但失败了,字符串值CONCAT('$', 500)被存储。

B

MyModel.update_all(price: "CONCAT('$', 500)")

当我尝试C时,我成功了,但我不想使用它,因为SQL注入风险。

C

MyModel.update_all("price = CONCAT('$', 500)")

我怎么做,没有任何风险的SQL注入攻击?
这里,由于某些原因,我不得不使用sql函数。

提前谢谢你。

您需要创建与允许的sql函数相对应的方法,这些函数将参数作为输入。所以如果你想提供"CONCAT(..,…)"然后用户应该能够调用这样的方法。您可以扩展它来检查允许的参数类型,并在那里添加检查。

def allowed_functions(func_name, all_args_here)
case func_name
when 'concat' then "CONCAT(#{all_args_here})"
end
end

相关内容

  • 没有找到相关文章

最新更新