此查询有效,但对 SQL 注入(inject)完全开放:
products = Product.find(pids,
:select => 'products.*, P.code',
:joins => "left join product_dist_match P on
(P.pid = products.pid and P.cid = #{cid})",
)
如何正确转义 cid 变量? conditions
参数允许格式 ['foo = ?', bar]
用于此目的,但 joins
不允许。
我不想使用 find_by_sql
,因为那时我需要添加属于模型默认范围的连接和条件(不会是 DRY)。
编辑:我的表结构基本上是这样的:
products: pid (primary key)
product_dist_match: pid, cid, code
customers (not used in the query): cid (primary key)
请注意,这是一个只读数据库,Rails 对它的参与有限。我不打算为所有表格设置模型;我只想执行一个如上所述的简单查询,而不会将自己暴露在 SQL 注入(inject)攻击中。
最佳答案
我找到的答案是在模型上使用.sanitize
方法:
products = Product.find(pids,
:select => 'products.*, P.code',
:joins => 'left join product_dist_match P on
(P.pid = products.pid and P.cid = ' + Product.sanitize(cid) + ')',
)
如果您找到更好的解决方案,请发布!
关于mysql - 连接子句中的 Rails ActiveRecord 转义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11831761/