簡體   English   中英

Rails ActiveRecord在join子句中的轉義變量

[英]Rails ActiveRecord escape variable in join clause

此查詢有效,但對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注入攻擊。

我找到的答案是在模型上使用.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) + ')',
)

如果您找到更好的解決方案,請發布!

這似乎是你想要做的更多。

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
    ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM