पोस्टग्रेज फ़ंक्शंस बनाम तैयार प्रश्नों में एसक्यूएल इंजेक्शन


30

Postgres में, SQL इंजेक्शन से सुरक्षा के लिए एक तंत्र के रूप में प्रश्नों और उपयोगकर्ता परिभाषित कार्यों को तैयार किया जाता है ?
क्या एक दृष्टिकोण में दूसरे पर विशेष लाभ हैं?

जवाबों:


36

निर्भर करता है।

SQL फ़ंक्शन

के साथ LANGUAGE sql, जवाब आम तौर पर हाँ है

पास किए गए मापदंडों को मूल्यों के रूप में माना जाता है और एसक्यूएल-इंजेक्शन संभव नहीं है - जब तक आप शरीर से असुरक्षित कार्यों को कॉल नहीं करते हैं और पैरामीटर पास नहीं करते हैं।

PL / pgSQL फ़ंक्शंस

इसके साथ LANGUAGE plpgsql, उत्तर सामान्य रूप से हां है

हालाँकि , पीएल / pgSQL डायनामिक SQL के लिए अनुमति देता है जहाँ पारित पैरामीटर (या भाग) एक क्वेरी स्ट्रिंग के लिए संक्षिप्त किए जाते हैं और साथ निष्पादित होते हैं EXECUTE। यह उपयोगकर्ता इनपुट को SQL कोड में बदल सकता है और SQL इंजेक्शन को संभव बनाता है । आप बाहर से यह नहीं बता सकते हैं कि फ़ंक्शन बॉडी इसे ठीक से संभालती है या नहीं। उपकरण प्रदान किए जाते हैं।

केवल डायनामिक SQL का उपयोग करें जहाँ आपको इसकी आवश्यकता है। मानों का उपयोग करते हुए सादा एसक्यूएल बयान एसक्यूएल फ़ंक्शन जैसे एसक्यूएल इंजेक्शन के खिलाफ सुरक्षित हैं।

के लिए गतिशील एसक्यूएल , अधिमानतः पारित मूल्यों के साथ मूल्यों के रूप में:

प्रिंसिपल पर SQL इंजेक्शन असंभव बनाता है।

यदि आप SQL स्ट्रिंग में मानों को बदलते हैं , तो उपयोग करें:

सिंगल-कोट्स में तारों को सुरक्षित रूप से लपेटता है , जिससे सिंटैक्स त्रुटियों और एसक्यूएल इंजेक्शन से बचा जाता है।

प्रक्रिया पैरामीटर जिसे SQL स्ट्रिंग में पहचानकर्ता के रूप में माना जाएगा :

जहां आवश्यक हो , वहां सुरक्षित रूप से दोहरे-उद्धरणों में तार संलग्न करें , जिससे वाक्यविन्यास त्रुटियों और एसक्यूएल इंजेक्शन से बचा जा सके।

सम्बंधित:

उपयोगकर्ता इनपुट से कभी भी एक स्ट्रिंग का निर्माण करें और निष्पादित करें। इसमें पहचानकर्ता शामिल हैं, सीधे उपयोगकर्ता द्वारा पारित या सिस्टम कैटलॉग से लाया गया। डायनेमिक SQL बनाते समय सभी को उपयोगकर्ता इनपुट की तरह व्यवहार किया जाता है और सुरक्षित रूप से उद्धृत किया जाता है!

इस संबंधित उत्तर में प्रदर्शन के निहितार्थ के बारे में अधिक :

एसक्यूएल-इंजेक्शन पर मूल बातें:

इसी तरह के विचार अन्य सर्वर-साइड भाषाओं पर लागू होते हैं जो गतिशील SQL की अनुमति देते हैं।


तो, संक्षेप में: यदि 1) मैं केवल भाषा sql का उपयोग करता हूं, तो मैं सुरक्षित हूं, 2) अगर मैं plpgslq का उपयोग करता हूं, लेकिन निष्पादित नहीं करता हूं, तो मैं सुरक्षित हूं, 3) अगर मैं plpgsql का उपयोग करता हूं और निष्पादित करता हूं, लेकिन कोई पहचानकर्ता और% s या% नहीं है उपयुक्त के रूप में एल मैं सुरक्षित हूं, या 4) अगर मैं plpgsql का उपयोग करता हूं और निष्पादित करता हूं और पहचानता हूं, लेकिन उचित रूप से मैं सुरक्षित हूं तो% I या quot_ident। सही बात?
mickeyf_supports_Monica

@ मिक्कीफ़: मूल रूप से हाँ। इसके अलावा, जब भी संभव हो USINGमूल्यों को पारित करने के लिए क्लॉज का उपयोग करें EXECUTE। आप एक SQL फ़ंक्शन के भीतर से PL / pgSQL फ़ंक्शन कॉल कर सकते हैं और पैरामीटर पास कर सकते हैं। तो, बिल्कुल सही होने के लिए, आप तब तक सुरक्षित हैं जब तक आप किसी भी असुरक्षित कार्य को प्रत्यक्ष या अप्रत्यक्ष रूप से नहीं कहते हैं। यदि आपके सभी कार्य सही तरीके से किए गए हैं, तो ऐसा नहीं हो सकता है।
एरविन ब्रैंडस्टैटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.