2011-04-07 9 views
7

मैं एक फिल्टर वस्तु है कई कॉलम युक्त तालिका क्वेरी करने के लिए, और बजाय एक शर्त है इस तरह सभी स्तंभों (वैकल्पिक छानने के लिए अनुमति) को कवर लिखें:Postgres का उपयोग कर स्तंभ नाम क्वेरी करने के लिए कैसे गतिशील/NpgSQL

WHERE ((:value0 IS NULL) OR (column_name0 = :value0)) AND ((:value1 IS NULL) OR (column_name1 = :value1)) AND... etc 
प्रत्येक कॉलम के लिए

WHERE :column_name0 = :value0 AND column_name1 = :value1 AND... etc 

जो संभव (इस जवाब given here के समान) नहीं है के रूप में कॉलम पार्स समय की आवश्यकता है: इसके बजाय, मैं आदर्श रूप में मैं एक पैरामीटर के रूप में क्षेत्र के नाम पर पारित करने में सक्षम होना चाहते हैं चाहते हैं ।

आप इसे कैसे दूर करते हैं? - जब मैं नए कॉलम जोड़े या हटाए जाते हैं तो मुझे वास्तव में एसक्यूएल को बनाए रखना नहीं है (जैसा कि आपको मेरे पहले उदाहरण में होना होगा) और मुझे लगता है कि कॉलम नामों को कमांड स्ट्रिंग में बनाना मेरे लिए खतरनाक होगा सीधे क्योंकि यह एसक्यूएल इंजेक्शन के लिए अनुमति दे सकता है।

ध्यान दें कि यह कोड एक वेब सेवा के पीछे है।

+0

क्यों आप अक्सर कॉलम जोड़ने या निकालने की जरूरत है? ऐसी आवश्यकता के लिए क्या अच्छा कारण है? –

+0

@ypercube, मुझे अक्सर ऐसा करने की आवश्यकता नहीं है। मैं अपने डेटाबेस में प्रत्येक बदलाव के लिए अपने फ़िल्टर ऑब्जेक्ट में एसक्यूएल को बनाए रखना नहीं चाहता था और साथ ही डेटा फ़िल्टर करने के लिए एक लचीली वस्तु प्रदान करता था। वैध कॉलम नाम प्राप्त करने के बारे में विचार के लिए –

उत्तर

23

बस सुनिश्चित करें कि अंतिम उपयोगकर्ता कॉलम नाम सीधे प्रदान नहीं कर सकते हैं और मैन्युअल रूप से क्वेरी का निर्माण करते समय आपको सुरक्षित होना चाहिए। आप पता लगाने के लिए क्या स्तंभ नाम क्रम पर मान्य आप निम्न क्वेरी का उपयोग कर सकते हैं की जरूरत है:

SELECT column_name 
FROM information_schema.columns 
WHERE table_schema='public' AND table_name='yourtablename' 
+1

+1। नोट - चूंकि यह एक वेब सेवा है, क्लाइंट सॉफ़्टवेयर फ़िल्टरिंग जानकारी प्रदान करता है, और हालांकि सुरक्षा/प्रमाणीकरण लागू किया गया है, फिर भी क्लाइंट से अन्य डेटा के साथ webservice को कॉल करना संभव हो सकता है। –

+0

मैं सेवा स्टार्टअप पर कॉलम नामों (टैबलेटनाम के शब्दकोश के अंदर) के शब्दकोश में (अनुमत) कॉलम नाम सर्वर पक्ष को स्टोर करने के लिए अपने विचार का उपयोग करने जा रहा हूं। क्लाइंट फ़िल्टर ऑब्जेक्ट –

1

मुझे लगता है कि सबसे आसान समाधान मक्खी पर SQL विवरण के निर्माण के लिए है।

यदि आप उपयोगकर्ता द्वारा प्रदत्त डेटा के पैरामीटर का उपयोग करते हैं तो एसक्यूएल इंजेक्शन संभव नहीं है।

+0

में उपयोग करने के लिए तालिका या कॉलम (ओं) के वास्तविक नामों को संदर्भित कर सकता है हां, फ्लाई पर एक आसान समाधान है, लेकिन चूंकि यह क्लाइंट में गुजरने वाला एक वेब सेवा है कॉलम जानकारी सहित फ़िल्टरिंग मानदंड, यह अभी भी हमले के लिए खुला हो सकता है। –

+1

आप सही हैं, यदि कॉलम नाम उपयोगकर्ता द्वारा प्रदान किए जाते हैं तो यह खतरनाक है। एक समाधान (सही नहीं) केवल वर्णों (ए-जेड, ए-जेड) और अंडरस्कोर (_) को अनुमति देना है। और संभवतः अंक (0-9), लेकिन शुरुआत में नहीं। –

+0

ग्राहक क्लाइंट एप्लिकेशन है। सही उत्तरों के लिए +1 है, हालांकि @Eelke ने मेरे प्रश्न का उत्तर देने का सबसे अच्छा विचार प्रदान किया है। –

0

उदाहरण:

NpgsqlCommand command = new NpgsqlCommand(SQL, Connection); 
     Npgsql.NpgsqlDataReader Resource = command.ExecuteReader(); 

     while (this.Resource.Read()) 
     { 
      for (int i = 0; i < this.Resource.FieldCount; i++) 
      { 
       string field = this.Resource.GetName(i).ToString(); 
      } 
     } 
संबंधित मुद्दे