避免在 JSON 列的参数化查询中转换为字符串

问题描述 投票:0回答:1

为了避免 SQL 注入,我们使用 ActiveRecord 的参数化查询,例如:

House.where("year_built > ?", 2000)

效果很好(上面的例子不是最佳的,因为它也可以是

House.where(year_built: [2000..])
,但它只是为了上下文)。

但是,当使用 JSON 列时,存在一个问题,传递给 WHERE 的值总是转换为字符串,例如“2000”而不是 2000。这是行不通的:

House.where("data->'$.year_built' > ?", 2000)
当我们比较整数和字符串时,

WHERE (data->'$.yearBuilt' > '2000')"
找不到任何结果。

有没有办法强制 Rails 中的参数化查询将

?
始终转换为数字?

sql ruby-on-rails activerecord prepared-statement
1个回答
0
投票

你有没有发现它不起作用?根据SQL手册

根据需要,字符串会自动转换为数字,数字也会自动转换为字符串。

在我随时可用的应用程序中,我尝试过:

Household.where("income > ?",40).to_sql

#=>"SELECT `households`.* FROM `households` WHERE (income > '40')"

所以看起来好像是将整数(收入列)与字符串进行比较。然而 mySQL 进行了必要的转换并产生了预期的结果。

© www.soinside.com 2019 - 2024. All rights reserved.