12

रेल 3 में मैं उन मौलिक क्षणों के लिए कच्चे एसक्यूएल को स्वच्छ करने के लिए sanitize_sql_array का उपयोग कर सकता हूं जहां कच्चे SQL क्वेरी की आवश्यकता होती है। लेकिन ऐसा लगता है कि रेल 4 में हटा दिया गया है, या इतना हटाया नहीं गया है, लेकिन ActiveRecord :: Sanitization में स्थानांतरित हो गया है। हालांकि, मैं यह नहीं समझ सकता कि sanitize_sql_array पर कॉल कैसे करें, तो रेल 4 में कच्चे एसक्यूएल को स्वच्छ करने का सबसे अच्छा तरीका क्या है?रेल में कच्चे एसक्यूएल को स्वच्छ करने के लिए कैसे करें 4

मैं यह स्पष्ट करना चाहता हूं कि मैं रेल के मॉडल का उपयोग न करने के लिए यहां एक पूर्ण कच्चे SQL क्वेरी के बारे में बात कर रहा हूं। मुझे पता है कि यह सबसे अच्छा अभ्यास नहीं है, यह वही है जो मुझे इस विशिष्ट क्वेरी के लिए करना है क्योंकि इसे रेल के अच्छे ActiveRecord इंटरफ़ेस द्वारा प्रदर्शित नहीं किया जा सकता है (मेरा विश्वास करो, मैंने कोशिश की है)। एक SQL क्वेरी को साफ़ करने में Active Record docs, सबसे अच्छा तरीका से

query = "SELECT * FROM users 
LEFT OUTER JOIN posts ON users.id=posts.user_id 
AND posts.topic_id = '#{topic.id}'" 
# ^- Obviously bad and very vulnerable, this is what we're trying to fix 
ActiveRecord::Base.connection.select_all(query) 

उत्तर

0

को से बचने के है हमारे अपने निर्माण करने के लिए:

यहां नमूने कॉल, जो स्पष्ट रूप से अपनी क्वेरी वास्तव में कैसा दिखता से अधिक आसान है शुद्ध स्ट्रिंग के रूप में की स्थिति, दूसरे शब्दों में, मानकों सीधे क्वेरी में, सम्मिलित करता है इस तरह:

User.find_by("user_name = '#{user_name}' AND password = '#{password}'") 

और बदले सरणी या हैश की स्थिति का उपयोग करें।

सरणी की स्थिति:

Client.where("orders_count = ? AND locked = ?", params[:orders], false) 

हैश की स्थिति:

Client.where(is_active: true) 

एक स्पष्ट उदाहरण:

+2

हैं अरे निक, प्रतिक्रिया के लिए धन्यवाद, लेकिन मैं एक जवाब है कि कच्चे एसक्यूएल प्रश्नों के माध्यम से जो मत जाओ के लिए काम करेगा लिए देख रहा था ActiveRecord मॉडल। मैंने इसे थोड़ा और स्पष्ट करने के लिए अपना प्रश्न अपडेट कर दिया है। –

+0

@ कोल्टनवॉज क्षमा करें, मैंने सवाल को गलत समझा। जैसा कि @ गैब्रियलहिलाल ने कहा था, 'उद्धरण' कच्चे एसक्यूएल क्वेरी को बिना किसी सक्रिय ActiveCecord मॉडल – NickGnd

+0

का उपयोग करने का सही तरीका है, यह उत्तर एसक्यूएल इंजेक्शन के लिए आदरणीय है, '# {user_name}' का उपयोग करके यह गलत है। – Hardik

11

आप quote उपयोग कर सकते हैं क्या तुम सच में कच्चे एसक्यूएल लिखने के लिए की जरूरत है यह साफ़ करने में:

conn = ActiveRecord::Base.connection 
name = conn.quote("John O'Neil") 
title = conn.quote(nil) 
query = "INSERT INTO users (name,title) VALUES (#{name}, #{title})" 
conn.execute(query) 
संबंधित मुद्दे