我想使用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