Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

रेल एक श्रेणी के साथ क्लॉज हैश सिंटैक्स का उपयोग करके प्रश्नों में `OR 1=0` क्यों जोड़ रहा है?

आपने जो तथ्य खोजा है, उस पर आधारित [1..5] श्रेणी निर्दिष्ट करने का सही तरीका नहीं है... मुझे पता चला है कि क्यों [1..5] जैसा व्यवहार करता है। वहां पहुंचने के लिए, मैंने पहली बार पाया कि हैश स्थिति में एक खाली सरणी 1=0 . उत्पन्न करती है SQL शर्त:

User.where(id: []).to_sql
# => "SELECT \"users\".* FROM \"users\"  WHERE 1=0"

और, यदि आप ActiveRecord::PredicateBuilder::ArrayHandler कोड , आप देखेंगे कि सरणी मान हमेशा श्रेणियों और अन्य मानों में विभाजित होते हैं।

ranges, values = values.partition { |v| v.is_a?(Range) }

यह बताता है कि आपको 1=0 क्यों नहीं दिखाई दे रहा है गैर-श्रेणी मानों का उपयोग करते समय। यानी 1=0 . पाने का एकमात्र तरीका एक श्रेणी को शामिल किए बिना एक सरणी से एक खाली सरणी की आपूर्ति करना है, जो 1=0 . उत्पन्न करता है स्थिति, जैसा कि ऊपर दिखाया गया है। और जब सभी सरणी में एक सीमा होती है तो आपको श्रेणी की स्थिति (ranges) मिलने वाली होती है ) और, अलग से, एक खाली सरणी स्थिति (values ) निष्पादित। मेरा अनुमान है कि इसके लिए कोई अच्छा कारण नहीं है ... इसे टालने की तुलना में इसे रहने देना आसान है (क्योंकि परिणाम सेट किसी भी तरह से बराबर है)। यदि विभाजन कोड थोड़ा अधिक स्मार्ट होता तो उसे अतिरिक्त, खाली values से निपटने की आवश्यकता नहीं होती सरणी और 1=0 को छोड़ सकता है हालत।

जहां के लिए 1=0 पहली जगह से आता है ... मुझे लगता है कि डेटाबेस एडाप्टर से आता है, लेकिन मुझे बिल्कुल कहां नहीं मिला। हालांकि, मैं इसे रिकॉर्ड खोजने में विफल होने का प्रयास कहूंगा। दूसरे शब्दों में, WHERE 1=0 कभी भी किसी भी उपयोगकर्ता को वापस नहीं करने वाला है, जो वैकल्पिक SQL जैसे WHERE id=null पर समझ में आता है जो किसी भी उपयोगकर्ता को मिलेगा जिसका आईडी शून्य है (यह महसूस करते हुए कि यह वास्तव में सही SQL वाक्यविन्यास नहीं है)। और यह वही है जो मैं उन सभी उपयोगकर्ताओं को खोजने का प्रयास करता हूं जिनकी आईडी खाली सेट में है (यानी हम शून्य आईडी या शून्य आईडी या जो कुछ भी नहीं मांग रहे हैं)। तो, मेरे दिमाग में, 1=0 . के बारे में थोड़ा सा छोड़कर ब्लैक बॉक्स के रूप में आता है ठीक है। कम से कम अब हम इस बारे में तर्क कर सकते हैं कि सरणी के अंदर की सीमा इसे क्यों दिखा रही है!

अपडेट करें

मैंने यह भी पाया है कि सीधे ARel का उपयोग करने पर भी आप 1=0 . प्राप्त कर सकते हैं :

User.arel_table[:id].in([]).to_sql
# => "1=0"


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL इंटीजर बनाम डेटटाइम इंडेक्स

  2. MySQL में फुल आउटर जॉइन कैसे करें?

  3. इनो सेटअप स्क्रिप्ट पर MySQL इंस्टाल और लोड डेटाबेस

  4. MYSQL में एक स्ट्रिंग का हिस्सा हटाना

  5. पीडीओ के साथ कई पंक्तियाँ सम्मिलित करें