Postgres में, SQL इंजेक्शन से सुरक्षा के लिए एक तंत्र के रूप में प्रश्नों और उपयोगकर्ता परिभाषित कार्यों को तैयार किया जाता है ?
क्या एक दृष्टिकोण में दूसरे पर विशेष लाभ हैं?
Postgres में, SQL इंजेक्शन से सुरक्षा के लिए एक तंत्र के रूप में प्रश्नों और उपयोगकर्ता परिभाषित कार्यों को तैयार किया जाता है ?
क्या एक दृष्टिकोण में दूसरे पर विशेष लाभ हैं?
जवाबों:
निर्भर करता है।
के साथ LANGUAGE sql
, जवाब आम तौर पर हाँ है ।
पास किए गए मापदंडों को मूल्यों के रूप में माना जाता है और एसक्यूएल-इंजेक्शन संभव नहीं है - जब तक आप शरीर से असुरक्षित कार्यों को कॉल नहीं करते हैं और पैरामीटर पास नहीं करते हैं।
इसके साथ LANGUAGE plpgsql
, उत्तर सामान्य रूप से हां है ।
हालाँकि , पीएल / pgSQL डायनामिक SQL के लिए अनुमति देता है जहाँ पारित पैरामीटर (या भाग) एक क्वेरी स्ट्रिंग के लिए संक्षिप्त किए जाते हैं और साथ निष्पादित होते हैं EXECUTE
। यह उपयोगकर्ता इनपुट को SQL कोड में बदल सकता है और SQL इंजेक्शन को संभव बनाता है । आप बाहर से यह नहीं बता सकते हैं कि फ़ंक्शन बॉडी इसे ठीक से संभालती है या नहीं। उपकरण प्रदान किए जाते हैं।
केवल डायनामिक SQL का उपयोग करें जहाँ आपको इसकी आवश्यकता है। मानों का उपयोग करते हुए सादा एसक्यूएल बयान एसक्यूएल फ़ंक्शन जैसे एसक्यूएल इंजेक्शन के खिलाफ सुरक्षित हैं।
के लिए गतिशील एसक्यूएल , अधिमानतः पारित मूल्यों के साथ मूल्यों के रूप में:
USING
खंड। उदाहरण है ।प्रिंसिपल पर SQL इंजेक्शन असंभव बनाता है।
यदि आप SQL स्ट्रिंग में मानों को बदलते हैं , तो उपयोग करें:
सिंगल-कोट्स में तारों को सुरक्षित रूप से लपेटता है , जिससे सिंटैक्स त्रुटियों और एसक्यूएल इंजेक्शन से बचा जाता है।
प्रक्रिया पैरामीटर जिसे SQL स्ट्रिंग में पहचानकर्ता के रूप में माना जाएगा :
format()
प्रारूप विनिर्देशक के साथ%I
। उदाहरण है ।quote_ident()
। उदाहरण है ।regclass
टेबल के नाम के लिए _tbl::regclass
:। उदाहरण है ।जहां आवश्यक हो , वहां सुरक्षित रूप से दोहरे-उद्धरणों में तार संलग्न करें , जिससे वाक्यविन्यास त्रुटियों और एसक्यूएल इंजेक्शन से बचा जा सके।
सम्बंधित:
उपयोगकर्ता इनपुट से कभी भी एक स्ट्रिंग का निर्माण न करें और निष्पादित करें। इसमें पहचानकर्ता शामिल हैं, सीधे उपयोगकर्ता द्वारा पारित या सिस्टम कैटलॉग से लाया गया। डायनेमिक SQL बनाते समय सभी को उपयोगकर्ता इनपुट की तरह व्यवहार किया जाता है और सुरक्षित रूप से उद्धृत किया जाता है!
इस संबंधित उत्तर में प्रदर्शन के निहितार्थ के बारे में अधिक :
एसक्यूएल-इंजेक्शन पर मूल बातें:
इसी तरह के विचार अन्य सर्वर-साइड भाषाओं पर लागू होते हैं जो गतिशील SQL की अनुमति देते हैं।
USING
मूल्यों को पारित करने के लिए क्लॉज का उपयोग करें EXECUTE
। आप एक SQL फ़ंक्शन के भीतर से PL / pgSQL फ़ंक्शन कॉल कर सकते हैं और पैरामीटर पास कर सकते हैं। तो, बिल्कुल सही होने के लिए, आप तब तक सुरक्षित हैं जब तक आप किसी भी असुरक्षित कार्य को प्रत्यक्ष या अप्रत्यक्ष रूप से नहीं कहते हैं। यदि आपके सभी कार्य सही तरीके से किए गए हैं, तो ऐसा नहीं हो सकता है।