2012-08-06 9 views
8

katılmak kaçış? conditions parametresi, bu amaç için ['foo = ?', bar] biçimini sağlar, ancak joins bunu yapmaz.Raylar ActiveRecord değişken bu sorgu çalışır, ancak SQL enjeksiyon için tamamen açıktır maddesini

find_by_sql kullanmak istemiyorum çünkü daha sonra modelin varsayılan kapsamının (DRY olmayacak) bir parçası olan birleşimleri ve koşulları eklemem gerekecek.

Düzenleme: Benim tablo yapısı esasen şudur: Bu yalnızca sınırlı katılımı Raylar salt okunur bir veritabanı

products: pid (primary key) 
product_dist_match: pid, cid, code 
customers (not used in the query): cid (primary key) 

Not söyledi. Tüm tablolar için modeller kurmayı planlamıyorum; Sadece kendimi SQL enjeksiyon saldırılarına maruz bırakmadan, yukarıda açıklandığı gibi basit bir sorgu yapmak istiyorum.

+1

Eğer tablo yapısını tarif edebilir? Bu, – davidrac

cevap

14

buldum cevap modeline .sanitize yöntemi kullanmaktır:

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) + ')', 
) 

daha iyi bir çözüm bulmak yayınlamayın lütfen!

+5

karma koşullarının kullanılmasıyla mümkün olabilir. Bunu aynı şekilde gerçekleştirdim - birinin birleşme koşullarına koşul eklemek istemediğini ve güvenli bir şekilde yapmak istemediğini düşünmek biraz ActiveRecord eksikliğinden kaynaklanıyor! – DaveStephens

+0

neden bir cümle içinde P.cid = cid işlevini kullanamıyoruz? – Ari53nN3o

+0

@parallelRails Yukarıdaki sorguyu "left join" yerine 'where' kullanarak yeniden yazmanın bir yolunu biliyorsanız ve aynı sonuçları alsanız, lütfen yanıt olarak gönderin! –

2

Bu, yapmaya çalıştığınız şeylerin daha fazlası gibi görünüyor.

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 
    ] 
İlgili konular