8

此查询有效,但对 SQL 注入完全开放:

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 注入攻击。

4

2 回答 2

15

我找到的答案是.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) + ')',
)

如果您找到更好的解决方案,请发布!

于 2012-08-06T16:58:31.807 回答
2

这似乎更像是你想要做的。

products = Product.find(pids,
    :select => 'products.*, P.code',
    :joins => sanitize_sql_array [
      'left join product_dist_match P on P.pid = products.pid and P.cid = ?', 
       cid
    ]
于 2014-10-20T21:43:43.960 回答