कॉमन गेटवे इंटरफ़ेस: Difference between revisions

From Vigyanwiki
(text)
Line 6: Line 6:
ऐसे प्रोग्राम अक्सर स्क्रिप्टिंग भाषा में लिखे जाते हैं और आमतौर पर सीजीआई स्क्रिप्ट के रूप में संदर्भित होते हैं, लेकिन इनमें [[ संकलक |संकलक]] प्रोग्राम शामिल हो सकते हैं।<ref>{{Cite web|last=Robinson <drtr@apache.org>|first=David|title=कॉमन गेटवे इंटरफ़ेस (CGI) संस्करण 1.1|url=https://tools.ietf.org/html/rfc3875#section-1.4|url-status=live|access-date=2021-02-16|website=tools.ietf.org|language=en|archive-url=https://web.archive.org/web/20070211125258/http://tools.ietf.org:80/html/rfc3875 |archive-date=11 February 2007 }}</ref>
ऐसे प्रोग्राम अक्सर स्क्रिप्टिंग भाषा में लिखे जाते हैं और आमतौर पर सीजीआई स्क्रिप्ट के रूप में संदर्भित होते हैं, लेकिन इनमें [[ संकलक |संकलक]] प्रोग्राम शामिल हो सकते हैं।<ref>{{Cite web|last=Robinson <drtr@apache.org>|first=David|title=कॉमन गेटवे इंटरफ़ेस (CGI) संस्करण 1.1|url=https://tools.ietf.org/html/rfc3875#section-1.4|url-status=live|access-date=2021-02-16|website=tools.ietf.org|language=en|archive-url=https://web.archive.org/web/20070211125258/http://tools.ietf.org:80/html/rfc3875 |archive-date=11 February 2007 }}</ref>


एक विशिष्ट उपयोग का मामला तब होता है जब वेब उपयोगकर्ता सीजीआई का उपयोग करने वाले वेब पेज पर [[ वेब फार्म |वेब फार्म]] प्रस्तुत करता है। प्रपत्र का डेटा [[HTTP अनुरोध|हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल]] के भीतर वेब सर्वर पर भेजा जाता है, जिसमें सीजीआई स्क्रिप्ट को दर्शाने वाला [[URL|सम स्रोत निर्धारक (यूआरएल)]] होता है। वेब सर्वर तब सीजीआई स्क्रिप्ट को नई [[कंप्यूटर प्रक्रिया]] में प्रक्षेपित करता है, इसमें फॉर्म डेटा पास करता है। सीजीआई स्क्रिप्ट का निर्गम, आमतौर पर [[HTML|एचटीएमएल]] के रूप में, स्क्रिप्ट द्वारा वेब सर्वर को लौटाया जाता है, और सर्वर इसे ब्राउज़र पर वापस भेज देता है क्योंकि ब्राउज़र के अनुरोध पर इसकीएचटीटीपी होती है।<ref name="rfc-3875">{{cite web| url = http://tools.ietf.org/html/rfc3875| title = RFC3875: The Common Gateway Interface (CGI) Version 1.1}}</ref>
एक विशिष्ट उपयोग का मामला तब होता है जब वेब उपयोगकर्ता सीजीआई का उपयोग करने वाले वेब पेज पर [[ वेब फार्म |वेब फार्म]] प्रस्तुत करता है। प्रपत्र का डेटा [[HTTP अनुरोध|हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल]] के भीतर वेब सर्वर पर भेजा जाता है, जिसमें सीजीआई स्क्रिप्ट को दर्शाने वाला [[URL|सम स्रोत निर्धारक (यूआरएल)]] होता है। वेब सर्वर तब सीजीआई स्क्रिप्ट को नई [[कंप्यूटर प्रक्रिया]] में प्रक्षेपित करता है, इसमें फॉर्म डेटा पास करता है। सीजीआई स्क्रिप्ट का निर्गम, आमतौर पर [[HTML|एचटीएमएल]] के रूप में, स्क्रिप्ट द्वारा वेब सर्वर को लौटाया जाता है, और सर्वर इसे ब्राउज़र पर वापस भेज देता है क्योंकि ब्राउज़र के अनुरोध पर इसकी एचटीटीपी होती है।<ref name="rfc-3875">{{cite web| url = http://tools.ietf.org/html/rfc3875| title = RFC3875: The Common Gateway Interface (CGI) Version 1.1}}</ref>


1990 के दशक की प्रारंभ में विकसित, सीजीआई सबसे प्रारंभिक सामान्य तरीका था जो एक वेब पेज को पारस्परिक होने की अनुमति देता था।
1990 के दशक की प्रारंभ में विकसित, सीजीआई सबसे प्रारंभिक सामान्य तरीका था जो एक वेब पेज को पारस्परिक होने की अनुमति देता था।


== इतिहास ==
== इतिहास ==
[[File:Common Gateway Interface logo.svg|thumbnail|विशेष घोषणा से आधिकारिक सीजीआई लोगो]]1993 में, [[सुपरकंप्यूटिंग अनुप्रयोगों के लिए राष्ट्रीय केंद्र]] (एनसीएसए) टीम ने www-टॉक मेलिंग सूची पर कमांड लाइन एक्जीक्यूटेबल्स को कॉल करने के लिए विनिर्देश लिखा था।<ref>{{cite web |title=कॉमन गेटवे इंटरफ़ेस|url=http://hoohoo.ncsa.uiuc.edu/cgi/ |website=hoohoo.ncsa.uiuc.edu |publisher=National Center for Supercomputing Applications (NCSA) |archive-url=https://web.archive.org/web/20100127161358/http://hoohoo.ncsa.illinois.edu/cgi/ |archive-date=2010-01-27}}</ref><ref>{{cite web |title=CGI: Common Gateway Interface |url=http://www.w3.org/CGI/ |website=w3.org |publisher=World Wide Web Consortium |df=mdy |access-date=2019-05-15}}</ref> अन्य वेब सर्वर डेवलपर्स ने इसे अपनाया, और तब से यह वेब सर्वर के लिए मानक बना हुआ है। सीजीआई की एनसीएसए परिभाषा को और अधिक औपचारिक रूप से परिभाषित करने के लिए नवंबर 1997 में [[और कोअर|केन कोअर]] की अध्यक्षता में कार्य समूह शुरू हुआ था।<ref>{{cite web |url=http://ken.coar.org/cgi/ |title=कॉमन गेटवे इंटरफ़ेस RFC प्रोजेक्ट पेज|archive-url=https://web.archive.org/web/20130825202222/http://ken.coar.org/cgi/ |archive-date=2013-08-25}}</ref> इस कार्य के परिणामस्वरूप [rfc:3875 आरएफसी 3875] प्राप्त हुआ, जो सीजीआई संस्करण 1.1 निर्दिष्ट करता है। आरएफसी में विशेष रूप से उल्लिखित निम्नलिखित योगदानकर्ता हैं:<ref name="rfc-3875"/>
[[File:Common Gateway Interface logo.svg|thumbnail|विशेष घोषणा से आधिकारिक सीजीआई लोगो]]1993 में, [[सुपरकंप्यूटिंग अनुप्रयोगों के लिए राष्ट्रीय केंद्र]] (एनसीएसए) टीम ने www-टॉक मेलिंग सूची पर कमांड लाइन एक्जीक्यूटेबल्स को कॉल करने के लिए विनिर्देश लिखा था।<ref>{{cite web |title=कॉमन गेटवे इंटरफ़ेस|url=http://hoohoo.ncsa.uiuc.edu/cgi/ |website=hoohoo.ncsa.uiuc.edu |publisher=National Center for Supercomputing Applications (NCSA) |archive-url=https://web.archive.org/web/20100127161358/http://hoohoo.ncsa.illinois.edu/cgi/ |archive-date=2010-01-27}}</ref><ref>{{cite web |title=CGI: Common Gateway Interface |url=http://www.w3.org/CGI/ |website=w3.org |publisher=World Wide Web Consortium |df=mdy |access-date=2019-05-15}}</ref> अन्य वेब सर्वर डेवलपर्स ने इसे अपनाया, और तब से यह वेब सर्वर के लिए मानक बना हुआ है। सीजीआई की एनसीएसए परिभाषा को और अधिक औपचारिक रूप से परिभाषित करने के लिए नवंबर 1997 में [[और कोअर|केन कोअर]] की अध्यक्षता में कार्य समूह प्रारंभ हुआ था।<ref>{{cite web |url=http://ken.coar.org/cgi/ |title=कॉमन गेटवे इंटरफ़ेस RFC प्रोजेक्ट पेज|archive-url=https://web.archive.org/web/20130825202222/http://ken.coar.org/cgi/ |archive-date=2013-08-25}}</ref> इस कार्य के परिणामस्वरूप [rfc:3875 आरएफसी 3875] प्राप्त हुआ, जो सीजीआई संस्करण 1.1 निर्दिष्ट करता है। आरएफसी में विशेष रूप से उल्लिखित निम्नलिखित योगदानकर्ता हैं:<ref name="rfc-3875"/>


* [[रोब मैककूल]] ([[NCSA HTTPd|एनसीएसए एचटीटीपीडी]] वेब सर्वर के लेखक)
* [[रोब मैककूल]] ([[NCSA HTTPd|एनसीएसए एचटीटीपीडी]] वेब सर्वर के लेखक)
Line 20: Line 20:
* जॉर्ज फिलिप्स (ब्रिटिश कोलंबिया विश्वविद्यालय में वेब सर्वर मेंटेनर)
* जॉर्ज फिलिप्स (ब्रिटिश कोलंबिया विश्वविद्यालय में वेब सर्वर मेंटेनर)


ऐतिहासिक रूप से सीजीआई प्रोग्राम अक्सर [[सी प्रोग्रामिंग भाषा|C प्रोग्रामिंग भाषा]] का उपयोग करके लिखे जाते थे। [rfc:3875 आरएफसी 3875] कॉमन गेटवे इंटरफ़ेस (सीजीआई) आंशिक रूप से C का उपयोग करके सीजीआई को परिभाषित करता है,<ref name="rfc-3875" />यह कहते हुए कि [[ सी पुस्तकालय |C लाइब्रेरी]] रूटीन गेटेनव () या वेरिएबल एनवायरन द्वारा परिवेश चर का उपयोग किया जाता है।
ऐतिहासिक रूप से सीजीआई प्रोग्राम अक्सर [[सी प्रोग्रामिंग भाषा|C प्रोग्रामिंग भाषा]] का उपयोग करके लिखे जाते थे।आरएफसी 3875 कॉमन गेटवे इंटरफ़ेस (सीजीआई) आंशिक रूप से C का उपयोग करके सीजीआई को परिभाषित करता है,<ref name="rfc-3875" />यह कहते हुए कि [[ सी पुस्तकालय |C लाइब्रेरी]] रूटीन गेटेनव () या वेरिएबल एनवायरन द्वारा परिवेश चर का उपयोग किया जाता है।


सीजीआई नाम वेब के प्रारंभिक दिनों से आया है, जहाँ [[वेबमास्टर]] आंकड़ाकोष (डेटाबेस) जैसी परंपरा सूचना प्रणाली को अपने वेब सर्वर से जोड़ना चाहते थे। सीजीआई प्रोग्राम को सर्वर द्वारा निष्पादित किया गया था जो वेब सर्वर और लीगेसी सूचना प्रणाली के बीच सामान्य गेटवे प्रदान करता था।
सीजीआई नाम वेब के प्रारंभिक दिनों से आया है, जहाँ [[वेबमास्टर]] आंकड़ाकोष (डेटाबेस) जैसी समागम सूचना प्रणाली को अपने वेब सर्वर से जोड़ना चाहते थे। सीजीआई प्रोग्राम को सर्वर द्वारा निष्पादित किया गया था जो वेब सर्वर और लीगेसी सूचना प्रणाली के बीच सामान्य गेटवे प्रदान करता था।


== सीजीआई विनिर्देश का उद्देश्य ==
== सीजीआई विनिर्देश का उद्देश्य ==
प्रत्येक वेब सर्वर [[HTTP]] सर्वर सॉफ़्टवेयर चलाता है, जो [[वेब ब्राउज़र]]ों के अनुरोधों का जवाब देता है। आम तौर पर, HTTP सर्वर में एक डायरेक्टरी (कंप्यूटिंग) | डायरेक्टरी (फ़ोल्डर) होती है, जिसे दस्तावेज़ संग्रह के रूप में नामित किया जाता है - ऐसी फ़ाइलें जिन्हें इस सर्वर से जुड़े वेब ब्राउज़रों को भेजा जा सकता है।<ref>{{cite web| url = http://httpd.apache.org/docs/2.2/urlmapping.html| title = Mapping URLs to Filesystem Locations Apache HTTP Server Version 2.2}}</ref> उदाहरण के लिए, यदि वेब सर्वर का डोमेन नाम है <code>example.com</code>, और इसका दस्तावेज़ संग्रह पर संग्रहीत है <code>/usr/local/apache/htdocs/</code> स्थानीय फाइल सिस्टम में, तब वेब सर्वर अनुरोध का जवाब देगा <code><nowiki>http://example.com/index.html</nowiki></code> ब्राउज़र को (पूर्व-लिखित) फ़ाइल भेजकर <code>/usr/local/apache/htdocs/index.html</code>.
प्रत्येक वेब सर्वर [[HTTP|एचटीटीपी]] सर्वर सॉफ़्टवेयर चलाता है, जो [[वेब ब्राउज़र]] के अनुरोधों का जवाब देता है। आम तौर पर, एचटीटीपी सर्वर में डायरेक्टरी (फ़ोल्डर) होती है, जिसे दस्तावेज़ संग्रह के रूप में नामित किया जाता है - ऐसी फ़ाइलें जिन्हें इस सर्वर से जुड़े वेब ब्राउज़रों को भेजा जा सकता है।<ref>{{cite web| url = http://httpd.apache.org/docs/2.2/urlmapping.html| title = Mapping URLs to Filesystem Locations Apache HTTP Server Version 2.2}}</ref> उदाहरण के लिए, यदि वेब सर्वर का प्रांत नाम है <code>example.com</code>, और इसका दस्तावेज़ संग्रह <code>/usr/local/apache/htdocs/</code> पर संग्रहीत है सीमित फाइल सिस्टम में, तब वेब सर्वर अनुरोध <code><nowiki>http://example.com/index.html</nowiki></code>का जवाब  ब्राउज़र को (पूर्व-लिखित) फ़ाइल <code>/usr/local/apache/htdocs/index.html</code> भेजकर देता है।


फ्लाई पर बनाए गए पृष्ठों के लिए, सर्वर सॉफ़्टवेयर अलग-अलग प्रोग्रामों के अनुरोधों को स्थगित कर सकता है और अनुरोध करने वाले क्लाइंट को परिणाम रिले कर सकता है (आमतौर पर, एक वेब ब्राउज़र जो पृष्ठ को अंतिम उपयोगकर्ता को प्रदर्शित करता है)। वेब के प्रारंभिक दिनों में, ऐसे प्रोग्राम आमतौर पर छोटे होते थे और स्क्रिप्टिंग भाषा में लिखे जाते थे; इसलिए, उन्हें स्क्रिप्ट के रूप में जाना जाता था।
फ्लाई पर बनाए गए पृष्ठों के लिए, सर्वर सॉफ़्टवेयर अलग-अलग प्रोग्रामों के अनुरोधों को स्थगित कर सकता है और अनुरोध करने वाले क्लाइंट को प्रभाव प्रसारित  कर सकता है (आमतौर पर, वेब ब्राउज़र जो पृष्ठ को अंतिम उपयोगकर्ता को प्रदर्शित करता है)। वेब के प्रारंभिक दिनों में, ऐसे प्रोग्राम आमतौर पर छोटे होते थे और स्क्रिप्टिंग भाषा में लिखे जाते थे; इसलिए, उन्हें स्क्रिप्ट के रूप में जाना जाता था।


ऐसे कार्यक्रमों के लिए आमतौर पर अनुरोध के साथ निर्दिष्ट की जाने वाली कुछ अतिरिक्त जानकारी की आवश्यकता होती है। उदाहरण के लिए, यदि विकिपीडिया को एक स्क्रिप्ट के रूप में लागू किया गया था, तो स्क्रिप्ट को यह जानने की आवश्यकता होगी कि क्या उपयोगकर्ता लॉग इन है और यदि लॉग इन है, तो किस नाम से। विकिपीडिया पृष्ठ के शीर्ष पर मौजूद सामग्री इस जानकारी पर निर्भर करती है।
ऐसे प्रोग्राम के लिए आमतौर पर अनुरोध के साथ निर्दिष्ट की जाने वाली कुछ अतिरिक्त जानकारी की आवश्यकता होती है। उदाहरण के लिए, यदि विकिपीडिया को स्क्रिप्ट के रूप में लागू किया गया था, तो स्क्रिप्ट को यह जानने की आवश्यकता होगी कि क्या उपयोगकर्ता लॉग इन है और यदि लॉग इन है, तो किस नाम से है। विकिपीडिया पृष्ठ के शीर्ष पर मौजूद सामग्री इस जानकारी पर निर्भर करती है।


HTTP वेब सर्वर को ऐसी जानकारी पास करने के लिए ब्राउज़रों को तरीके प्रदान करता है, उदा। यूआरएल के हिस्से के रूप में। सर्वर सॉफ़्टवेयर को इस जानकारी को किसी तरह स्क्रिप्ट के माध्यम से पास करना चाहिए।
एचटीटीपी वेब सर्वर को ऐसी जानकारी पास करने के लिए ब्राउज़रों को तरीके प्रदान करता है, उदाहरण यूआरएल के हिस्से के रूप में प्रदान करता है। सर्वर सॉफ़्टवेयर को इस जानकारी को किसी तरह स्क्रिप्ट के माध्यम से पास करना चाहिए।


इसके विपरीत, लौटने पर, स्क्रिप्ट को अनुरोध के जवाब के लिए HTTP द्वारा आवश्यक सभी जानकारी प्रदान करनी चाहिए: अनुरोध की HTTP स्थिति, दस्तावेज़ सामग्री (यदि उपलब्ध हो), दस्तावेज़ प्रकार (जैसे एचटीएमएल, PDF, या सादा पाठ) , वगैरह।
इसके विपरीत, लौटने पर, स्क्रिप्ट को अनुरोध के जवाब के लिए एचटीटीपी द्वारा आवश्यक सभी जानकारी प्रदान करनी चाहिए: अनुरोध की एचटीटीपी स्थिति, दस्तावेज़ सामग्री (यदि उपलब्ध हो), दस्तावेज़ प्रकार (जैसे एचटीएमएल, पीडीएफ, या प्लेन टेक्स्ट), वगैरह है।


प्रारंभ में, अलग-अलग सर्वर सॉफ़्टवेयर इस जानकारी को स्क्रिप्ट के साथ आदान-प्रदान करने के लिए अलग-अलग तरीकों का उपयोग करेंगे। नतीजतन, ऐसी स्क्रिप्ट लिखना संभव नहीं था जो अलग-अलग सर्वर सॉफ़्टवेयर के लिए अपरिवर्तित काम करे, भले ही आदान-प्रदान की जाने वाली जानकारी समान थी। इसलिए, इस जानकारी के आदान-प्रदान के लिए एक तरीका निर्दिष्ट करने का निर्णय लिया गया: सीजीआई (कॉमन गेटवे इंटरफ़ेस, क्योंकि यह सर्वर सॉफ़्टवेयर के लिए स्क्रिप्ट के साथ इंटरफ़ेस करने का एक सामान्य तरीका परिभाषित करता है)।
प्रारंभ में, अलग-अलग सर्वर सॉफ़्टवेयर इस जानकारी को स्क्रिप्ट के साथ आदान-प्रदान करने के लिए अलग-अलग तरीकों का उपयोग करते है। नतीजतन, ऐसी स्क्रिप्ट लिखना संभव नहीं था जो अलग-अलग सर्वर सॉफ़्टवेयर के लिए अपरिवर्तित काम करे, भले ही आदान-प्रदान की जाने वाली जानकारी समान थी। इसलिए, इस जानकारी के आदान-प्रदान के लिए तरीका निर्दिष्ट करने का निर्णय लिया गया: सीजीआई (कॉमन गेटवे इंटरफ़ेस, क्योंकि यह सर्वर सॉफ़्टवेयर के लिए स्क्रिप्ट के साथ इंटरफ़ेस करने का सामान्य तरीका परिभाषित करता है)।
सीजीआई विनिर्देश के अनुसार काम करने वाले सर्वर सॉफ़्टवेयर द्वारा शुरू किए गए वेबपेज जनरेटिंग प्रोग्राम को सीजीआई स्क्रिप्ट के रूप में जाना जाता है।


यह विनिर्देश जल्दी से अपनाया गया था और अभी भी सभी प्रसिद्ध सर्वर सॉफ़्टवेयर द्वारा समर्थित है, जैसे Apache HTTP सर्वर, [[इंटरनेट सूचना सेवाएँ]], और (विस्तार के साथ) नोड.जेएस-आधारित सर्वर।
सीजीआई विनिर्देश के अनुसार काम करने वाले सर्वर सॉफ़्टवेयर द्वारा प्रारंभ किए गए वेबपेज जनक प्रोग्राम को सीजीआई स्क्रिप्ट के रूप में जाना जाता है।


सीजीआई लिपियों का प्रारंभिक उपयोग प्रपत्रों को संसाधित करने के लिए किया गया था। एचटीएमएल की प्रारंभ में, एचटीएमएल फॉर्म में आमतौर पर एक एक्शन एट्रिब्यूट और प्रस्तुत बटन के रूप में नामित एक बटन होता था। जब प्रस्तुत बटन को धक्का दिया जाता है तो कार्रवाई विशेषता में निर्दिष्ट यूआरआई [[क्वेरी स्ट्रिंग]] के रूप में भेजे गए फॉर्म से डेटा के साथ सर्वर को भेजा जाएगा। यदि क्रिया एक सीजीआई स्क्रिप्ट निर्दिष्ट करती है तो सीजीआई स्क्रिप्ट निष्पादित की जाएगी और फिर यह एक एचटीएमएल पेज बनाती है।
यह विनिर्देश जल्दी से अपनाया गया था और अभी भी सभी प्रसिद्ध सर्वर सॉफ़्टवेयर द्वारा समर्थित है, जैसे अपाचे (Apache) एचटीटीपी सर्वर, [[इंटरनेट सूचना सेवाएँ]], और (विस्तार के साथ) नोड.जेएस-आधारित सर्वर है।
 
सीजीआई स्क्रिप्ट का प्रारंभिक उपयोग प्रपत्रों को संसाधित करने के लिए किया गया था। एचटीएमएल की प्रारंभ में, एचटीएमएल फॉर्म में आमतौर पर एक्शन विशेषता और प्रस्तुत बटन के रूप में नामित बटन होता था। जब प्रस्तुत बटन को दबाव दिया जाता है तो कार्रवाई विशेषता में निर्दिष्ट यूआरआई [[क्वेरी स्ट्रिंग]] के रूप में भेजे गए फॉर्म से डेटा के साथ सर्वर को भेजा जाता था। यदि क्रिया सीजीआई स्क्रिप्ट निर्दिष्ट करती है तो सीजीआई स्क्रिप्ट निष्पादित की जाएगी और फिर यह एचटीएमएल पेज बनाती है।


== सीजीआई स्क्रिप्ट का प्रयोग ==
== सीजीआई स्क्रिप्ट का प्रयोग ==
एक वेब सर्वर अपने मालिक को यह कॉन्फ़िगर करने की अनुमति देता है कि कौन से यूआरएल को किस सीजीआई स्क्रिप्ट द्वारा नियंत्रित किया जाएगा।
वेब सर्वर अपने स्तामी को यह समनुरूप करने की अनुमति देता है कि कौन से यूआरएल को किस सीजीआई स्क्रिप्ट द्वारा नियंत्रित किया जाता था।
 
यह आमतौर पर दस्तावेज़ संग्रह के भीतर एक नई निर्देशिका को सीजीआई स्क्रिप्ट वाले के रूप में चिह्नित करके किया जाता है - इसका नाम अक्सर होता है <code>cgi-bin</code>. उदाहरण के लिए, <code>/usr/local/apache/htdocs/cgi-bin</code> वेब सर्वर पर सीजीआई निर्देशिका के रूप में नामित किया जा सकता है। जब एक वेब ब्राउजर एक यूआरएल का अनुरोध करता है जो सीजीआई निर्देशिका के भीतर एक फाइल को इंगित करता है (उदाहरण के लिए, <code><nowiki>http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string</nowiki></code>), फिर, केवल उस फ़ाइल को भेजने के बजाय (<code>/usr/local/apache/htdocs/cgi-bin/printenv.pl</code>) वेब ब्राउजर पर, HTTP सर्वर निर्दिष्ट स्क्रिप्ट चलाता है और स्क्रिप्ट के निर्गम को वेब ब्राउजर को पास करता है। अर्थात्, स्क्रिप्ट द्वारा [[मानक आउटपुट|मानक निर्गम]] पर भेजी जाने वाली कोई भी चीज़ टर्मिनल विंडो में ऑन-स्क्रीन दिखाए जाने के बजाय वेब क्लाइंट को भेज दी जाती है।
 
जैसा कि ऊपर बताया गया है, सीजीआई विनिर्देश परिभाषित करता है कि अनुरोध के साथ पास की गई अतिरिक्त जानकारी स्क्रिप्ट को कैसे पास की जाती है।
उदाहरण के लिए, यदि एक स्लैश और अतिरिक्त निर्देशिका नाम स्क्रिप्ट के नाम के ठीक बाद यूआरएल में जोड़े जाते हैं (इस उदाहरण में, <code>/with/additional/path</code>), तो वह पथ में संग्रहीत है <code>PATH_INFO</code> स्क्रिप्ट कहे जाने से पहले परिवेश चर। यदि स्क्रिप्ट को [[HTTP GET]] अनुरोध के माध्यम से पैरामीटर भेजे जाते हैं (यूआरएल में एक प्रश्न चिह्न जोड़ा जाता है, जिसके बाद param=value जोड़े; उदाहरण में, <code>?and=a&query=string</code>), तो उन मापदंडों को इसमें संग्रहीत किया जाता है <code>QUERY_STRING</code> स्क्रिप्ट कहे जाने से पहले परिवेश चर। यदि [[HTTP POST]] अनुरोध के माध्यम से स्क्रिप्ट को पैरामीटर भेजे जाते हैं, तो वे स्क्रिप्ट के [[मानक इनपुट]] में पास हो जाते हैं। स्क्रिप्ट तब इन परिवेश चर या मानक इनपुट से डेटा पढ़ सकती है और वेब ब्राउज़र के अनुरोध के अनुकूल हो सकती है।<ref>Nelson, Anne Fulcher, and Nelson, William Harris Morehead. (2001). Building Electronic Commerce with Web Database Constructions. Boston, MA: Addison Wesley.</ref>


यह आमतौर पर दस्तावेज़ संग्रह के भीतर नई डायरेक्टरी को सीजीआई स्क्रिप्ट वाले के रूप में चिह्नित करके किया जाता है - इसका नाम अक्सर <code>cgi-bin</code>  होता है उदाहरण के लिए, <code>/usr/local/apache/htdocs/cgi-bin</code> वेब सर्वर पर सीजीआई डायरेक्टरी के रूप में नामित किया जा सकता है। जब वेब ब्राउजर यूआरएल का अनुरोध करता है जो सीजीआई डायरेक्टरी के भीतर फाइल को इंगित करता है (उदाहरण के लिए, <code><nowiki>http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string</nowiki></code>), फिर, केवल उस फ़ाइल  (<code>/usr/local/apache/htdocs/cgi-bin/printenv.pl</code>) को भेजने के बजाय वेब ब्राउजर पर, एचटीटीपी सर्वर निर्दिष्ट स्क्रिप्ट चलाता है और स्क्रिप्ट के निर्गम को वेब ब्राउजर को पास करता है। अर्थात्, स्क्रिप्ट द्वारा [[मानक आउटपुट|मानक निर्गम]] पर भेजी जाने वाली कोई भी चीज़ टर्मिनल विंडो में ऑन-स्क्रीन दिखाए जाने के बजाय वेब क्लाइंट को भेज दी जाती है।


जैसा कि ऊपर बताया गया है, सीजीआई विनिर्देश परिभाषित करता है कि अनुरोध के साथ पास की गई अतिरिक्त जानकारी स्क्रिप्ट को कैसे पास की जाती है। उदाहरण के लिए, यदि स्लैश और अतिरिक्त डायरेक्टरी नाम स्क्रिप्ट के नाम के ठीक बाद यूआरएल में जोड़े जाते हैं (इस उदाहरण में, <code>/with/additional/path</code>), तो वह पथ <code>PATH_INFO</code>  स्क्रिप्ट कहे जाने से पहले परिवेश चर में संग्रहीत है। यदि स्क्रिप्ट को [[HTTP GET|एचटीटीपी]] जीईटीअनुरोध के माध्यम से मापदंडों भेजे जाते हैं (यूआरएल में प्रश्न चिह्न जोड़ा जाता है, जिसके बाद परम = मूल्य जोड़े; उदाहरण में, <code>?and=a&query=string</code>), तो उन मापदंडों को  <code>QUERY_STRING</code> स्क्रिप्ट कहे जाने से पहले परिवेश चर इसमें संग्रहीत किया जाता है। यदि [[HTTP POST|एचटीटीपी पोस्ट]] अनुरोध के माध्यम से स्क्रिप्ट को मापदंडों भेजे जाते हैं, तो वे स्क्रिप्ट के [[मानक इनपुट|मानक निविष्टि]] में पास हो जाते हैं। स्क्रिप्ट तब इन परिवेश चर या मानक निविष्टि से डेटा पढ़ सकती है और वेब ब्राउज़र के अनुरोध के अनुकूल हो सकती है।<ref>Nelson, Anne Fulcher, and Nelson, William Harris Morehead. (2001). Building Electronic Commerce with Web Database Constructions. Boston, MA: Addison Wesley.</ref>
== उदाहरण ==
== उदाहरण ==
निम्नलिखित [[पर्ल]] प्रोग्राम वेब सर्वर द्वारा पास किए गए सभी परिवेश चर दिखाता है:
निम्नलिखित [[पर्ल]] प्रोग्राम वेब सर्वर द्वारा पास किए गए सभी परिवेश चर दिखाता है:
Line 103: Line 101:
WINDIR="C:\Windows"
WINDIR="C:\Windows"
}}
}}
इन चरों में से कुछ, लेकिन सभी नहीं, सीजीआई मानक द्वारा परिभाषित किए गए हैं।
इन चरों में से कुछ, लेकिन सभी नहीं, सीजीआई मानक द्वारा परिभाषित किए गए हैं। कुछ, जैसे <code>PATH_INFO</code>, <code>QUERY_STRING</code>, और से प्रारंभ होने वाले <code>HTTP_</code>, हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल से जानकारी पास करते है।
कुछ, जैसे <code>PATH_INFO</code>, <code>QUERY_STRING</code>, और से शुरू होने वाले <code>HTTP_</code>, हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल से जानकारी पास करें।


परिवेश से, यह देखा जा सकता है कि वेब ब्राउज़र [[फ़ायरफ़ॉक्स]] विंडोज 7 पीसी पर चल रहा है, वेब सर्वर [[ अपाचे HTTP सर्वर ]] है जो [[यूनिक्स]] का अनुकरण करने वाले सिस्टम पर चल रहा है, और सीजीआई स्क्रिप्ट का नाम है <code>cgi-bin/printenv.pl</code>.
परिवेश से, यह देखा जा सकता है कि वेब ब्राउज़र [[फ़ायरफ़ॉक्स]] विंडोज 7 पीसी पर चल रहा है, वेब सर्वर [[ अपाचे HTTP सर्वर |अपाचे एचटीटीपी सर्वर]] है जो [[यूनिक्स]] का अनुकरण करने वाले सिस्टम पर चल रहा है, और सीजीआई स्क्रिप्ट का नाम <code>cgi-bin/printenv.pl</code>है।


कार्यक्रम तब कोई भी सामग्री उत्पन्न कर सकता है, उसे मानक धाराओं #मानक निर्गम .28stdout.29 पर लिखें, और वेब सर्वर इसे ब्राउज़र पर प्रसारित करेगा।
प्रोग्राम तब कोई भी सामग्री उत्पन्न कर सकता है, उसे मानक निर्गम .28stdout.29 पर लिखें, और वेब सर्वर इसे ब्राउज़र पर प्रसारित करता है।


सीजीआई प्रोग्राम्स को पास किए गए परिवेश चर निम्नलिखित हैं:
सीजीआई प्रोग्राम्स को पास किए गए परिवेश चर निम्नलिखित हैं:


* सर्वर विशिष्ट चर:
* सर्वर विशिष्ट चर:
** <code>SERVER_SOFTWARE</code>: [[HTTP सर्वर]] का <var>नाम</var>/<var>संस्करण</var>।
** <code>SERVER_SOFTWARE</code>: [[HTTP सर्वर|एचटीटीपी सर्वर]] का <var>नाम</var>/<var>संस्करण</var>।
** <code>SERVER_NAME</code>: सर्वर का [[मेजबान का नाम]], [[डॉट-दशमलव अंकन]] हो सकता है | डॉट-दशमलव आईपी पता।
** <code>SERVER_NAME</code>: सर्वर का [[मेजबान का नाम]], [[डॉट-दशमलव अंकन]] हो सकता है | डॉट-दशमलव आईपी पता।
** <code>GATEWAY_INTERFACE</code>: सीजीआई/<var>संस्करण</var>।
** <code>GATEWAY_INTERFACE</code>: सीजीआई/<var>संस्करण</var>।
* अनुरोध विशिष्ट चर:
* अनुरोध विशिष्ट चर:
** <code>SERVER_PROTOCOL</code>: HTTP/<var>संस्करण</var>।
** <code>SERVER_PROTOCOL</code>: एचटीटीपी/<var>संस्करण</var>।
** <code>SERVER_PORT</code>: [[टीसीपी पोर्ट]] (दशमलव)।
** <code>SERVER_PORT</code>: [[टीसीपी पोर्ट]] (दशमलव)।
** <code>REQUEST_METHOD</code>: HTTP विधि का नाम (ऊपर देखें)।
** <code>REQUEST_METHOD</code>: एचटीटीपी विधि का नाम (ऊपर देखें)।
** <code>PATH_INFO</code>: पथ प्रत्यय, यदि प्रोग्राम नाम और स्लैश के बाद यूआरएल में जोड़ा जाता है।
** <code>PATH_INFO</code>: पथ प्रत्यय, यदि प्रोग्राम नाम और स्लैश के बाद यूआरएल में जोड़ा जाता है।
** <code>PATH_TRANSLATED</code>: संबंधित पूर्ण पथ जैसा कि सर्वर द्वारा माना जाता है, यदि <code>PATH_INFO</code> मौजूद है।
** <code>PATH_TRANSLATED</code>: संबंधित पूर्ण पथ जैसा कि सर्वर द्वारा माना जाता है, यदि <code>PATH_INFO</code> मौजूद है।
** <code>SCRIPT_NAME</code>: कार्यक्रम के सापेक्ष पथ, जैसे <code>/cgi-bin/script.cgi</code>.
** <code>SCRIPT_NAME</code>: प्रोग्राम के सापेक्ष पथ, जैसे <code>/cgi-bin/script.cgi</code>.
** <code>QUERY_STRING</code>: प्रश्नवाचक चिह्न के बाद यूआरएल का भाग|<span style= background-color:#FFFFCC; पैडिंग: 2px >?</span> अक्षर। क्वेरी स्ट्रिंग *<var>name</var>=<var>value</var> जोड़े से बना हो सकता है जो [[एम्परसेंड]] से अलग किया गया हो (जैसे <var>var1</var>=<var>val1</var>& <var>var2</var>=<var>val2</var>...) जब एचटीएमएल application/x-www-form-urlencoded द्वारा परिभाषित GET विधि के माध्यम से स्थानांतरित किए गए [[फॉर्म (वेब)]] डेटा को प्रस्तुत करने के लिए उपयोग किया जाता है।
** <code>QUERY_STRING</code>: प्रश्नवाचक चिह्न के बाद यूआरएल का भाग <span style= background-color:#FFFFCC; पैडिंग: 2px >?</span> अक्षर। क्वेरी स्ट्रिंग *<var>name</var>=<var>value</var> जोड़े से बना हो सकता है जो [[एम्परसेंड]] से अलग किया गया हो (जैसे <var>var1</var>=<var>val1</var>& <var>var2</var>=<var>val2</var>...) जब एचटीएमएल application/x-www-form-urlencoded द्वारा परिभाषित जीईटीविधि के माध्यम से स्थानांतरित किए गए [[फॉर्म (वेब)]] डेटा को प्रस्तुत करने के लिए उपयोग किया जाता है।
** <code>REMOTE_HOST</code>: क्लाइंट का होस्ट नाम, अगर सर्वर ने ऐसा लुकअप नहीं किया तो अनसेट।
** <code>REMOTE_HOST</code>: क्लाइंट का होस्ट नाम, अगर सर्वर ने ऐसा लुकअप नहीं किया तो अनसेट।
** <code>REMOTE_ADDR</code>: ग्राहक का आईपी पता (डॉट-दशमलव)।
** <code>REMOTE_ADDR</code>: ग्राहक का आईपी पता (डॉट-दशमलव)।
Line 129: Line 126:
** <code>REMOTE_USER</code> निश्चित के लिए प्रयोग किया जाता है <code>AUTH_TYPE</code>एस।
** <code>REMOTE_USER</code> निश्चित के लिए प्रयोग किया जाता है <code>AUTH_TYPE</code>एस।
** <code>REMOTE_IDENT</code>: [[पहचान प्रोटोकॉल]] देखें, केवल तभी जब सर्वर ने ऐसा लुकअप किया हो।
** <code>REMOTE_IDENT</code>: [[पहचान प्रोटोकॉल]] देखें, केवल तभी जब सर्वर ने ऐसा लुकअप किया हो।
** <code>CONTENT_TYPE</code>: [[इंटरनेट मीडिया प्रकार]] का इनपुट डेटा यदि PUT या POST विधि का उपयोग किया जाता है, जैसा कि HTTP हेडर के माध्यम से प्रदान किया गया है।
** <code>CONTENT_TYPE</code>: [[इंटरनेट मीडिया प्रकार]] का निविष्टि डेटा यदि पुट या पोस्ट विधि का उपयोग किया जाता है, जैसा कि एचटीटीपी हेडर के माध्यम से प्रदान किया गया है।
** <code>CONTENT_LENGTH</code>: इसी तरह, इनपुट डेटा का आकार (दशमलव, ऑक्टेट में (कंप्यूटिंग)) यदि HTTP हेडर के माध्यम से प्रदान किया गया हो।
** <code>CONTENT_LENGTH</code>: इसी तरह, निविष्टि डेटा का आकार (दशमलव, ऑक्टेट में (कंप्यूटिंग)) यदि एचटीटीपी हेडर के माध्यम से प्रदान किया गया हो।
** उपयोगकर्ता एजेंट द्वारा पारित चर (<code>HTTP_ACCEPT</code>, <code>HTTP_ACCEPT_LANGUAGE</code>, <code>HTTP_USER_AGENT</code>, <code>HTTP_COOKIE</code> और संभवतः अन्य) में संबंधित [[HTTP शीर्षलेख]]ों के मान होते हैं और इसलिए समान अर्थ होते हैं।
** उपयोगकर्ता एजेंट द्वारा पारित चर (<code>HTTP_ACCEPT</code>, <code>HTTP_ACCEPT_LANGUAGE</code>, <code>HTTP_USER_AGENT</code>, <code>HTTP_COOKIE</code> और संभवतः अन्य) में संबंधित [[HTTP शीर्षलेख|एचटीटीपी शीर्षलेख]] के मान होते हैं और इसलिए समान अर्थ होते हैं।


प्रोग्राम वेब सर्वर को मानक निर्गम के रूप में परिणाम लौटाता है, जिसकी प्रारंभ हेडर और लाइन (पाठ फ़ाइल) से होती है।
प्रोग्राम वेब सर्वर को मानक निर्गम के रूप में प्रभाव लौटाता है, जिसकी प्रारंभ हेडर और लाइन (टेक्स्ट फ़ाइल) से होती है।


हेडर उसी तरह एन्कोड किया गया है जैसे [[HTTP शीर्षलेखों की सूची]] और लौटाए गए दस्तावेज़ के एमआईएमई प्रकार को शामिल करना चाहिए।<ref>{{cite web| url = http://www.citycat.ru/doc/CGI/overview/primer.html| title = CGI Primer (Mirror at citycat.ru)}}</ref> हेडर, वेब सर्वर द्वारा पूरक, आम तौर पर प्रतिक्रिया के साथ उपयोगकर्ता को वापस भेज दिए जाते हैं।
हेडर उसी तरह एन्कोड किया गया है जैसे [[HTTP शीर्षलेखों की सूची|एचटीटीपी शीर्षलेखों की सूची]] और लौटाए गए दस्तावेज़ के एमआईएमई प्रकार को शामिल करना चाहिए।<ref>{{cite web| url = http://www.citycat.ru/doc/CGI/overview/primer.html| title = CGI Primer (Mirror at citycat.ru)}}</ref> हेडर, वेब सर्वर द्वारा पूरक, आम तौर पर प्रतिक्रिया के साथ उपयोगकर्ता को वापस भेज दिए जाते हैं।


यहाँ एचटीएमएल के साथ Python 3 में लिखा गया एक सरल सीजीआई प्रोग्राम है जो एक साधारण जोड़ समस्या को संभालता है।<ref>{{Cite web|url=http://www.abacles.com/html-forms.html|title=Abacles HTML प्रपत्र|website=www.abacles.com|access-date=2016-04-06|archive-url=https://web.archive.org/web/20160419181112/http://www.abacles.com/html-forms.html|archive-date=19 April 2016|url-status=dead}}</ref>
यहाँ एचटीएमएल के साथ पायथन 3 में लिखा गया सरल सीजीआई प्रोग्राम है जो साधारण जोड़ समस्या को संभालता है।<ref>{{Cite web|url=http://www.abacles.com/html-forms.html|title=Abacles HTML प्रपत्र|website=www.abacles.com|access-date=2016-04-06|archive-url=https://web.archive.org/web/20160419181112/http://www.abacles.com/html-forms.html|archive-date=19 April 2016|url-status=dead}}</ref>


<code>add.html</code>:
<code>add.html</code>:
Line 174: Line 171:
     raise SystemExit(1)
     raise SystemExit(1)
print("<output>{0} + {1} = {2}</output>".format(num1, num2, num1 + num2))
print("<output>{0} + {1} = {2}</output>".format(num1, num2, num1 + num2))
</syntaxhighlight>यह Python 3 सीजीआई प्रोग्राम एचटीएमएल से इनपुट प्राप्त करता है और दो संख्याओं को एक साथ जोड़ता है।
</syntaxhighlight>यह पायथन 3 सीजीआई प्रोग्राम एचटीएमएल से निविष्टि प्राप्त करता है और दो संख्याओं को एक साथ जोड़ता है।


== परिनियोजन ==
== परिनियोजन ==
एक वेब सर्वर जो सीजीआई का समर्थन करता है उसे [[यूनिफ़ॉर्म रिसोर्स लोकेटर]] की व्याख्या करने के लिए कॉन्फ़िगर किया जा सकता है जो कि सीजीआई स्क्रिप्ट के संदर्भ के रूप में कार्य करता है। एक आम सम्मेलन एक होना है <code>cgi-bin/</code> निर्देशिका पेड़ के आधार पर निर्देशिका (कंप्यूटिंग) और इस निर्देशिका के भीतर सभी निष्पादन योग्य फ़ाइलों (और सुरक्षा के लिए कोई अन्य नहीं) को सीजीआई स्क्रिप्ट के रूप में मानें। [[फ़ाइल नाम एक्सटेंशन]] का उपयोग करना एक अन्य लोकप्रिय परंपरा है; उदाहरण के लिए, यदि सीजीआई स्क्रिप्ट को लगातार विस्तार दिया जाता है <code>.cgi</code>, वेब सर्वर को सीजीआई स्क्रिप्ट के रूप में ऐसी सभी फाइलों की व्याख्या करने के लिए कॉन्फ़िगर किया जा सकता है। जबकि सुविधाजनक, और कई प्रीपैक्ड स्क्रिप्ट्स के लिए आवश्यक है, यह हमला करने के लिए सर्वर को खोलता है यदि कोई दूरस्थ उपयोगकर्ता निष्पादन योग्य कोड को उचित एक्सटेंशन के साथ अपलोड कर सकता है।
वेब सर्वर जो सीजीआई का समर्थन करता है उसे [[यूनिफ़ॉर्म रिसोर्स लोकेटर]] की व्याख्या करने के लिए समनुरूप किया जा सकता है जो कि सीजीआई स्क्रिप्ट के संदर्भ के रूप में कार्य करता है। एक आम समागम होना है <code>cgi-bin/</code> डायरेक्टरी ट्री के आधार पर डायरेक्टरी (कंप्यूटिंग) और इस डायरेक्टरी के भीतर सभी निष्पादन योग्य फ़ाइलों (और सुरक्षा के लिए कोई अन्य नहीं) को सीजीआई स्क्रिप्ट के रूप में मानें जाते है। [[फ़ाइल नाम एक्सटेंशन]] का उपयोग करना अन्य लोकप्रिय समागम है; उदाहरण के लिए, यदि सीजीआई स्क्रिप्ट को लगातार विस्तार <code>.cgi</code> दिया जाता है , वेब सर्वर को सीजीआई स्क्रिप्ट के रूप में ऐसी सभी फाइलों की व्याख्या करने के लिए समनुरूप किया जा सकता है। जबकि सुविधाजनक, और कई प्रीपैक्ड स्क्रिप्ट्स के लिए आवश्यक है, यह हमला करने के लिए सर्वर को खोलता है यदि कोई दूरस्थ उपयोगकर्ता निष्पादन योग्य कोड को उचित एक्सटेंशन के साथ अपलोड कर सकता है।


HTTP#Request विधियों के मामले में, उपयोगकर्ता द्वारा प्रस्तुत किया गया डेटा मानक इनपुट के माध्यम से प्रोग्राम को प्रदान किया जाता है। वेब सर्वर इसे पास किए गए परिवेश चर का एक सबसेट बनाता है और HTTP वातावरण से संबंधित विवरण जोड़ता है।
एचटीटीपी पुट या पोस्ट विधियों के मामले में, उपयोगकर्ता द्वारा प्रस्तुत किया गया डेटा मानक निविष्टि के माध्यम से प्रोग्राम को प्रदान किया जाता है। वेब सर्वर इसे पास किए गए परिवेश चर का सबसेट बनाता है और एचटीटीपी वातावरण से संबंधित विवरण जोड़ता है।


== उपयोग ==
== उपयोग ==
सीजीआई का उपयोग अक्सर उपयोगकर्ता से इनपुट जानकारी को प्रोसेस करने और उचित निर्गम देने के लिए किया जाता है। सीजीआई कार्यक्रम का एक उदाहरण एक [[ सप्ताह ]] को लागू करना है। यदि उपयोगकर्ता एजेंट किसी प्रविष्टि के नाम का अनुरोध करता है, तो वेब सर्वर सीजीआई प्रोग्राम को निष्पादित करता है। सीजीआई प्रोग्राम उस प्रविष्टि के पृष्ठ के स्रोत को पुनः प्राप्त करता है (यदि कोई मौजूद है), इसे एचटीएमएल में रूपांतरित करता है, और परिणाम को प्रिंट करता है। वेब सर्वर सीजीआई प्रोग्राम से निर्गम प्राप्त करता है और इसे उपयोगकर्ता एजेंट को भेजता है। फिर यदि उपयोगकर्ता एजेंट पृष्ठ संपादित करें बटन पर क्लिक करता है, तो सीजीआई प्रोग्राम एक एचटीएमएल पॉप्युलेट करता है <code>textarea</code> या पृष्ठ की सामग्री के साथ अन्य संपादन नियंत्रण। अंत में यदि उपयोगकर्ता एजेंट पब्लिश पेज बटन पर क्लिक करता है, तो सीजीआई प्रोग्राम अपडेट किए गए एचटीएमएल को उस प्रविष्टि के पेज के स्रोत में बदल देता है और उसे सहेज लेता है।
सीजीआई का उपयोग अक्सर उपयोगकर्ता से निविष्टि जानकारी को प्रोसेस करने और उचित निर्गम देने के लिए किया जाता है। सीजीआई प्रोग्राम का एक उदाहरण एक [[ सप्ताह ]] को लागू करना है। यदि उपयोगकर्ता एजेंट किसी प्रविष्टि के नाम का अनुरोध करता है, तो वेब सर्वर सीजीआई प्रोग्राम को निष्पादित करता है। सीजीआई प्रोग्राम उस प्रविष्टि के पृष्ठ के स्रोत को पुनः प्राप्त करता है (यदि कोई मौजूद है), इसे एचटीएमएल में रूपांतरित करता है, और प्रभाव को प्रिंट करता है। वेब सर्वर सीजीआई प्रोग्राम से निर्गम प्राप्त करता है और इसे उपयोगकर्ता एजेंट को भेजता है। फिर यदि उपयोगकर्ता एजेंट पृष्ठ संपादित करें बटन पर क्लिक करता है, तो सीजीआई प्रोग्राम एक एचटीएमएल पॉप्युलेट करता है <code>textarea</code> या पृष्ठ की सामग्री के साथ अन्य संपादन नियंत्रण। अंत में यदि उपयोगकर्ता एजेंट पब्लिश पेज बटन पर क्लिक करता है, तो सीजीआई प्रोग्राम अपडेट किए गए एचटीएमएल को उस प्रविष्टि के पेज के स्रोत में बदल देता है और उसे सहेज लेता है।


== सुरक्षा ==
== सुरक्षा ==
सीजीआई प्रोग्राम डिफ़ॉल्ट रूप से वेब सर्वर के सुरक्षा संदर्भ में चलते हैं। जब पहली बार प्रस्तुत किया गया तो एनसीएसए, Apache और CERN वेब सर्वर के संदर्भ वितरण के साथ कई उदाहरण स्क्रिप्ट प्रदान किए गए थे ताकि यह दिखाया जा सके कि नए सीजीआई का उपयोग करने के लिए शेल स्क्रिप्ट या C प्रोग्राम को कैसे कोडित किया जा सकता है। ऐसा ही एक उदाहरण स्क्रिप्ट PHF नामक एक सीजीआई प्रोग्राम था जिसने एक साधारण फोन बुक लागू की।
सीजीआई प्रोग्राम डिफ़ॉल्ट रूप से वेब सर्वर के सुरक्षा संदर्भ में चलते हैं। जब पहली बार प्रस्तुत किया गया तो एनसीएसए, Apache और CERN वेब सर्वर के संदर्भ वितरण के साथ कई उदाहरण स्क्रिप्ट प्रदान किए गए थे ताकि यह दिखाया जा सके कि नए सीजीआई का उपयोग करने के लिए शेल स्क्रिप्ट या C प्रोग्राम को कैसे कोडित किया जा सकता है। ऐसा ही एक उदाहरण स्क्रिप्ट PHF नामक एक सीजीआई प्रोग्राम था जिसने एक साधारण फोन बुक लागू की।


उस समय की कई अन्य लिपियों के साथ आम तौर पर, इस स्क्रिप्ट ने एक फ़ंक्शन का उपयोग किया: <code>escape_shell_cmd()</code>. फ़ंक्शन को अपने तर्क को साफ करना था, जो उपयोगकर्ता इनपुट से आया था और फिर वेब सर्वर के सुरक्षा संदर्भ में चलाने के लिए यूनिक्स शेल में इनपुट पास करता था। स्क्रिप्ट ने सभी इनपुट को सही ढंग से स्वच्छ नहीं किया और शेल में नई लाइनों को पारित करने की अनुमति दी, जिसने प्रभावी रूप से कई कमांड को चलाने की अनुमति दी। इन आदेशों के परिणाम तब वेब सर्वर पर प्रदर्शित किए गए थे। यदि वेब सर्वर के सुरक्षा संदर्भ ने इसकी अनुमति दी है, तो हमलावरों द्वारा दुर्भावनापूर्ण आदेश निष्पादित किए जा सकते हैं।
उस समय की कई अन्य स्क्रिप्ट के साथ आम तौर पर, इस स्क्रिप्ट ने एक फ़ंक्शन का उपयोग किया: <code>escape_shell_cmd()</code>. फ़ंक्शन को अपने तर्क को साफ करना था, जो उपयोगकर्ता निविष्टि से आया था और फिर वेब सर्वर के सुरक्षा संदर्भ में चलाने के लिए यूनिक्स शेल में निविष्टि पास करता था। स्क्रिप्ट ने सभी निविष्टि को सही ढंग से स्वच्छ नहीं किया और शेल में नई लाइनों को पारित करने की अनुमति दी, जिसने प्रभावी रूप से कई कमांड को चलाने की अनुमति दी। इन आदेशों के प्रभाव तब वेब सर्वर पर प्रदर्शित किए गए थे। यदि वेब सर्वर के सुरक्षा संदर्भ ने इसकी अनुमति दी है, तो हमलावरों द्वारा दुर्भावनापूर्ण आदेश निष्पादित किए जा सकते हैं।


यह एक [[कोड इंजेक्शन]] का पहला व्यापक उदाहरण था, जहां वेब उपयोगकर्ताओं के असंक्रमित डेटा से वेब सर्वर पर कोड का निष्पादन हो सकता है। क्योंकि उदाहरण कोड डिफ़ॉल्ट रूप से स्थापित किया गया था, हमले व्यापक थे और 1996 की प्रारंभ में कई सुरक्षा सलाहकारों का नेतृत्व किया।<ref>{{cite web |title=phf CGI स्क्रिप्ट न्यूलाइन वर्णों से बचाव करने में विफल रहती है|url=https://www.kb.cert.org/vuls/id/20276/ |website=Software Engineering Institute CERT Coordination Center |access-date=21 November 2019}}</ref>
यह एक [[कोड इंजेक्शन]] का पहला व्यापक उदाहरण था, जहां वेब उपयोगकर्ताओं के असंक्रमित डेटा से वेब सर्वर पर कोड का निष्पादन हो सकता है। क्योंकि उदाहरण कोड डिफ़ॉल्ट रूप से स्थापित किया गया था, हमले व्यापक थे और 1996 की प्रारंभ में कई सुरक्षा सलाहकारों का नेतृत्व किया।<ref>{{cite web |title=phf CGI स्क्रिप्ट न्यूलाइन वर्णों से बचाव करने में विफल रहती है|url=https://www.kb.cert.org/vuls/id/20276/ |website=Software Engineering Institute CERT Coordination Center |access-date=21 November 2019}}</ref>
Line 193: Line 190:


== विकल्प ==
== विकल्प ==
प्रत्येक आने वाले हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल के लिए, एक वेब सर्वर इसे संभालने के लिए एक नई सीजीआई [[प्रक्रिया (कंप्यूटिंग)]] बनाता है और हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल को संभालने के बाद सीजीआई प्रक्रिया को नष्ट कर देता है। एक प्रक्रिया को बनाने और नष्ट करने से प्रक्रिया के निर्गम को उत्पन्न करने के वास्तविक कार्य की तुलना में बहुत अधिक CPU और मेमोरी की खपत हो सकती है, खासकर जब सीजीआई प्रोग्राम को अभी भी एक वर्चुअल मशीन द्वारा [[व्याख्या]] करने की आवश्यकता होती है। उच्च संख्या में HTTP अनुरोधों के लिए, परिणामी कार्यभार वेब सर्वर को जल्दी से अभिभूत कर सकता है।
प्रत्येक आने वाले हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल के लिए, एक वेब सर्वर इसे संभालने के लिए एक नई सीजीआई [[प्रक्रिया (कंप्यूटिंग)]] बनाता है और हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल को संभालने के बाद सीजीआई प्रक्रिया को नष्ट कर देता है। एक प्रक्रिया को बनाने और नष्ट करने से प्रक्रिया के निर्गम को उत्पन्न करने के वास्तविक कार्य की तुलना में बहुत अधिक CPU और मेमोरी की खपत हो सकती है, खासकर जब सीजीआई प्रोग्राम को अभी भी एक वर्चुअल मशीन द्वारा [[व्याख्या]] करने की आवश्यकता होती है। उच्च संख्या में एचटीटीपी अनुरोधों के लिए, परिणामी कार्यभार वेब सर्वर को जल्दी से अभिभूत कर सकता है।


सीजीआई प्रक्रिया निर्माण और विनाश में शामिल [[कम्प्यूटेशनल ओवरहेड]] को निम्नलिखित तकनीकों से कम किया जा सकता है:
सीजीआई प्रक्रिया निर्माण और विनाश में शामिल [[कम्प्यूटेशनल ओवरहेड]] को निम्नलिखित तकनीकों से कम किया जा सकता है:


* सीजीआई प्रोग्राम [[मशीन कोड]] के लिए पूर्वसंकलित होते हैं, उदा. वर्चुअल मशीन द्वारा व्याख्या किए गए सीजीआई प्रोग्राम के बजाय C (प्रोग्रामिंग लैंग्वेज) या C ++ प्रोग्राम से पहले से संकलित, उदा। पर्ल, [[पीएचपी]] या [[पायथन (प्रोग्रामिंग भाषा)]] प्रोग्राम।
* सीजीआई प्रोग्राम [[मशीन कोड]] के लिए पूर्वसंकलित होते हैं, उदा. वर्चुअल मशीन द्वारा व्याख्या किए गए सीजीआई प्रोग्राम के बजाय C (प्रोग्रामिंग लैंग्वेज) या C ++ प्रोग्राम से पहले से संकलित, उदाहरण पर्ल, [[पीएचपी]] या [[पायथन (प्रोग्रामिंग भाषा)]] प्रोग्राम।
* वेब सर्वर एक्सटेंशन जैसे कि [[अपाचे मॉड्यूल]] (जैसे mod_perl, mod_php, mod_python), [[नेटस्केप सर्वर एप्लीकेशन प्रोग्रामिंग इंटरफ़ेस]] प्लगइन्स, और [[ISAPI]] प्लगइन्स जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को संभालने और वेब सर्वर के भीतर होस्ट करने की अनुमति देते हैं। वेब 2.0 क्लाइंट से डेटा को एचटीएमएल फॉर्म का उपयोग किए बिना और उपयोगकर्ता को नोटिस किए बिना सर्वर में स्थानांतरित करने की अनुमति देता है।<ref>{{cite thesis |author=Enrico Marino |date=11 September 2018 |title=वितरित वेब में सूचना प्रबंधन|type=phd |publisher=[[Roma Tre University]] |url=http://phd.dia.uniroma3.it/wp-content/uploads/2018/03/Phd-Thesis-Enrico-Marino.pdf |archive-url=https://web.archive.org/web/20190212011410/http://phd.dia.uniroma3.it/wp-content/uploads/2018/03/Phd-Thesis-Enrico-Marino.pdf |archive-date=2019-02-12 |url-status=live |access-date=11 February 2019}}</ref>
* वेब सर्वर एक्सटेंशन जैसे कि [[अपाचे मॉड्यूल]] (जैसे mod_perl, mod_php, mod_python), [[नेटस्केप सर्वर एप्लीकेशन प्रोग्रामिंग इंटरफ़ेस]] प्लगइन्स, और [[ISAPI]] प्लगइन्स जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को संभालने और वेब सर्वर के भीतर होस्ट करने की अनुमति देते हैं। वेब 2.0 क्लाइंट से डेटा को एचटीएमएल फॉर्म का उपयोग किए बिना और उपयोगकर्ता को नोटिस किए बिना सर्वर में स्थानांतरित करने की अनुमति देता है।<ref>{{cite thesis |author=Enrico Marino |date=11 September 2018 |title=वितरित वेब में सूचना प्रबंधन|type=phd |publisher=[[Roma Tre University]] |url=http://phd.dia.uniroma3.it/wp-content/uploads/2018/03/Phd-Thesis-Enrico-Marino.pdf |archive-url=https://web.archive.org/web/20190212011410/http://phd.dia.uniroma3.it/wp-content/uploads/2018/03/Phd-Thesis-Enrico-Marino.pdf |archive-date=2019-02-12 |url-status=live |access-date=11 February 2019}}</ref>
* [[FastCGI]], [[सरल सामान्य गेटवे इंटरफ़ेस]], और Apache JServ प्रोटोकॉल जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को बाहरी रूप से होस्ट करने की अनुमति देता है; यानी, वेब सर्वर से अलग। प्रत्येक आवेदन प्रक्रिया एक सॉकेट पर सुनती है; वेब सर्वर एक हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल को संभालता है और इसे दूसरे प्रोटोकॉल (FastCGI, SCGI या AJP) के माध्यम से केवल गतिशील सामग्री के लिए सॉकेट में भेजता है, जबकि स्थैतिक सामग्री को आमतौर पर सीधे वेब सर्वर द्वारा नियंत्रित किया जाता है। इस दृष्टिकोण को कम अनुप्रयोग प्रक्रियाओं की आवश्यकता होती है इसलिए वेब सर्वर एक्सटेंशन दृष्टिकोण की तुलना में कम मेमोरी की खपत होती है। और एप्लिकेशन प्रोग्राम को वेब सर्वर एक्सटेंशन में बदलने के विपरीत, FastCGI, SCGI और AJP एप्लिकेशन प्रोग्राम वेब सर्वर से स्वतंत्र रहते हैं।
* [[FastCGI]], [[सरल सामान्य गेटवे इंटरफ़ेस]], और Apache JServ प्रोटोकॉल जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को बाहरी रूप से होस्ट करने की अनुमति देता है; यानी, वेब सर्वर से अलग। प्रत्येक आवेदन प्रक्रिया एक सॉकेट पर सुनती है; वेब सर्वर एक हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल को संभालता है और इसे दूसरे प्रोटोकॉल (FastCGI, SCGI या AJP) के माध्यम से केवल गतिशील सामग्री के लिए सॉकेट में भेजता है, जबकि स्थैतिक सामग्री को आमतौर पर सीधे वेब सर्वर द्वारा नियंत्रित किया जाता है। इस दृष्टिकोण को कम अनुप्रयोग प्रक्रियाओं की आवश्यकता होती है इसलिए वेब सर्वर एक्सटेंशन दृष्टिकोण की तुलना में कम मेमोरी की खपत होती है। और एप्लिकेशन प्रोग्राम को वेब सर्वर एक्सटेंशन में बदलने के विपरीत, FastCGI, SCGI और AJP एप्लिकेशन प्रोग्राम वेब सर्वर से स्वतंत्र रहते हैं।

Revision as of 11:08, 3 March 2023

कम्प्यूटिंग में, कॉमन गेटवे इंटरफ़ेस (सीजीआई) एक इंटरफ़ेस विनिर्देश है जो वेब सर्वर को बाहरी प्रोग्राम निष्पादित करने में सक्षम बनाता है, आमतौर पर उपयोगकर्ता अनुरोधों को संसाधित करने के लिए होता है।[1]

ऐसे प्रोग्राम अक्सर स्क्रिप्टिंग भाषा में लिखे जाते हैं और आमतौर पर सीजीआई स्क्रिप्ट के रूप में संदर्भित होते हैं, लेकिन इनमें संकलक प्रोग्राम शामिल हो सकते हैं।[2]

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

1990 के दशक की प्रारंभ में विकसित, सीजीआई सबसे प्रारंभिक सामान्य तरीका था जो एक वेब पेज को पारस्परिक होने की अनुमति देता था।

इतिहास

विशेष घोषणा से आधिकारिक सीजीआई लोगो

1993 में, सुपरकंप्यूटिंग अनुप्रयोगों के लिए राष्ट्रीय केंद्र (एनसीएसए) टीम ने www-टॉक मेलिंग सूची पर कमांड लाइन एक्जीक्यूटेबल्स को कॉल करने के लिए विनिर्देश लिखा था।[4][5] अन्य वेब सर्वर डेवलपर्स ने इसे अपनाया, और तब से यह वेब सर्वर के लिए मानक बना हुआ है। सीजीआई की एनसीएसए परिभाषा को और अधिक औपचारिक रूप से परिभाषित करने के लिए नवंबर 1997 में केन कोअर की अध्यक्षता में कार्य समूह प्रारंभ हुआ था।[6] इस कार्य के परिणामस्वरूप [rfc:3875 आरएफसी 3875] प्राप्त हुआ, जो सीजीआई संस्करण 1.1 निर्दिष्ट करता है। आरएफसी में विशेष रूप से उल्लिखित निम्नलिखित योगदानकर्ता हैं:[3]

  • जॉन फ्रैंक्स (जीएन वेब सर्वर के लेखक)
  • अरी लुओटोनेन (सीईआरएन एचटीटीपीडी वेब सर्वर के विकासकर्ता)
  • टोनी सैंडर्स (प्लेक्सस वेब सर्वर के लेखक)
  • जॉर्ज फिलिप्स (ब्रिटिश कोलंबिया विश्वविद्यालय में वेब सर्वर मेंटेनर)

ऐतिहासिक रूप से सीजीआई प्रोग्राम अक्सर C प्रोग्रामिंग भाषा का उपयोग करके लिखे जाते थे।आरएफसी 3875 कॉमन गेटवे इंटरफ़ेस (सीजीआई) आंशिक रूप से C का उपयोग करके सीजीआई को परिभाषित करता है,[3]यह कहते हुए कि C लाइब्रेरी रूटीन गेटेनव () या वेरिएबल एनवायरन द्वारा परिवेश चर का उपयोग किया जाता है।

सीजीआई नाम वेब के प्रारंभिक दिनों से आया है, जहाँ वेबमास्टर आंकड़ाकोष (डेटाबेस) जैसी समागम सूचना प्रणाली को अपने वेब सर्वर से जोड़ना चाहते थे। सीजीआई प्रोग्राम को सर्वर द्वारा निष्पादित किया गया था जो वेब सर्वर और लीगेसी सूचना प्रणाली के बीच सामान्य गेटवे प्रदान करता था।

सीजीआई विनिर्देश का उद्देश्य

प्रत्येक वेब सर्वर एचटीटीपी सर्वर सॉफ़्टवेयर चलाता है, जो वेब ब्राउज़र के अनुरोधों का जवाब देता है। आम तौर पर, एचटीटीपी सर्वर में डायरेक्टरी (फ़ोल्डर) होती है, जिसे दस्तावेज़ संग्रह के रूप में नामित किया जाता है - ऐसी फ़ाइलें जिन्हें इस सर्वर से जुड़े वेब ब्राउज़रों को भेजा जा सकता है।[7] उदाहरण के लिए, यदि वेब सर्वर का प्रांत नाम है example.com, और इसका दस्तावेज़ संग्रह /usr/local/apache/htdocs/ पर संग्रहीत है सीमित फाइल सिस्टम में, तब वेब सर्वर अनुरोध http://example.com/index.htmlका जवाब ब्राउज़र को (पूर्व-लिखित) फ़ाइल /usr/local/apache/htdocs/index.html भेजकर देता है।

फ्लाई पर बनाए गए पृष्ठों के लिए, सर्वर सॉफ़्टवेयर अलग-अलग प्रोग्रामों के अनुरोधों को स्थगित कर सकता है और अनुरोध करने वाले क्लाइंट को प्रभाव प्रसारित कर सकता है (आमतौर पर, वेब ब्राउज़र जो पृष्ठ को अंतिम उपयोगकर्ता को प्रदर्शित करता है)। वेब के प्रारंभिक दिनों में, ऐसे प्रोग्राम आमतौर पर छोटे होते थे और स्क्रिप्टिंग भाषा में लिखे जाते थे; इसलिए, उन्हें स्क्रिप्ट के रूप में जाना जाता था।

ऐसे प्रोग्राम के लिए आमतौर पर अनुरोध के साथ निर्दिष्ट की जाने वाली कुछ अतिरिक्त जानकारी की आवश्यकता होती है। उदाहरण के लिए, यदि विकिपीडिया को स्क्रिप्ट के रूप में लागू किया गया था, तो स्क्रिप्ट को यह जानने की आवश्यकता होगी कि क्या उपयोगकर्ता लॉग इन है और यदि लॉग इन है, तो किस नाम से है। विकिपीडिया पृष्ठ के शीर्ष पर मौजूद सामग्री इस जानकारी पर निर्भर करती है।

एचटीटीपी वेब सर्वर को ऐसी जानकारी पास करने के लिए ब्राउज़रों को तरीके प्रदान करता है, उदाहरण यूआरएल के हिस्से के रूप में प्रदान करता है। सर्वर सॉफ़्टवेयर को इस जानकारी को किसी तरह स्क्रिप्ट के माध्यम से पास करना चाहिए।

इसके विपरीत, लौटने पर, स्क्रिप्ट को अनुरोध के जवाब के लिए एचटीटीपी द्वारा आवश्यक सभी जानकारी प्रदान करनी चाहिए: अनुरोध की एचटीटीपी स्थिति, दस्तावेज़ सामग्री (यदि उपलब्ध हो), दस्तावेज़ प्रकार (जैसे एचटीएमएल, पीडीएफ, या प्लेन टेक्स्ट), वगैरह है।

प्रारंभ में, अलग-अलग सर्वर सॉफ़्टवेयर इस जानकारी को स्क्रिप्ट के साथ आदान-प्रदान करने के लिए अलग-अलग तरीकों का उपयोग करते है। नतीजतन, ऐसी स्क्रिप्ट लिखना संभव नहीं था जो अलग-अलग सर्वर सॉफ़्टवेयर के लिए अपरिवर्तित काम करे, भले ही आदान-प्रदान की जाने वाली जानकारी समान थी। इसलिए, इस जानकारी के आदान-प्रदान के लिए तरीका निर्दिष्ट करने का निर्णय लिया गया: सीजीआई (कॉमन गेटवे इंटरफ़ेस, क्योंकि यह सर्वर सॉफ़्टवेयर के लिए स्क्रिप्ट के साथ इंटरफ़ेस करने का सामान्य तरीका परिभाषित करता है)।

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

यह विनिर्देश जल्दी से अपनाया गया था और अभी भी सभी प्रसिद्ध सर्वर सॉफ़्टवेयर द्वारा समर्थित है, जैसे अपाचे (Apache) एचटीटीपी सर्वर, इंटरनेट सूचना सेवाएँ, और (विस्तार के साथ) नोड.जेएस-आधारित सर्वर है।

सीजीआई स्क्रिप्ट का प्रारंभिक उपयोग प्रपत्रों को संसाधित करने के लिए किया गया था। एचटीएमएल की प्रारंभ में, एचटीएमएल फॉर्म में आमतौर पर एक्शन विशेषता और प्रस्तुत बटन के रूप में नामित बटन होता था। जब प्रस्तुत बटन को दबाव दिया जाता है तो कार्रवाई विशेषता में निर्दिष्ट यूआरआई क्वेरी स्ट्रिंग के रूप में भेजे गए फॉर्म से डेटा के साथ सर्वर को भेजा जाता था। यदि क्रिया सीजीआई स्क्रिप्ट निर्दिष्ट करती है तो सीजीआई स्क्रिप्ट निष्पादित की जाएगी और फिर यह एचटीएमएल पेज बनाती है।

सीजीआई स्क्रिप्ट का प्रयोग

वेब सर्वर अपने स्तामी को यह समनुरूप करने की अनुमति देता है कि कौन से यूआरएल को किस सीजीआई स्क्रिप्ट द्वारा नियंत्रित किया जाता था।

यह आमतौर पर दस्तावेज़ संग्रह के भीतर नई डायरेक्टरी को सीजीआई स्क्रिप्ट वाले के रूप में चिह्नित करके किया जाता है - इसका नाम अक्सर cgi-bin होता है उदाहरण के लिए, /usr/local/apache/htdocs/cgi-bin वेब सर्वर पर सीजीआई डायरेक्टरी के रूप में नामित किया जा सकता है। जब वेब ब्राउजर यूआरएल का अनुरोध करता है जो सीजीआई डायरेक्टरी के भीतर फाइल को इंगित करता है (उदाहरण के लिए, http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string), फिर, केवल उस फ़ाइल (/usr/local/apache/htdocs/cgi-bin/printenv.pl) को भेजने के बजाय वेब ब्राउजर पर, एचटीटीपी सर्वर निर्दिष्ट स्क्रिप्ट चलाता है और स्क्रिप्ट के निर्गम को वेब ब्राउजर को पास करता है। अर्थात्, स्क्रिप्ट द्वारा मानक निर्गम पर भेजी जाने वाली कोई भी चीज़ टर्मिनल विंडो में ऑन-स्क्रीन दिखाए जाने के बजाय वेब क्लाइंट को भेज दी जाती है।

जैसा कि ऊपर बताया गया है, सीजीआई विनिर्देश परिभाषित करता है कि अनुरोध के साथ पास की गई अतिरिक्त जानकारी स्क्रिप्ट को कैसे पास की जाती है। उदाहरण के लिए, यदि स्लैश और अतिरिक्त डायरेक्टरी नाम स्क्रिप्ट के नाम के ठीक बाद यूआरएल में जोड़े जाते हैं (इस उदाहरण में, /with/additional/path), तो वह पथ PATH_INFO स्क्रिप्ट कहे जाने से पहले परिवेश चर में संग्रहीत है। यदि स्क्रिप्ट को एचटीटीपी जीईटीअनुरोध के माध्यम से मापदंडों भेजे जाते हैं (यूआरएल में प्रश्न चिह्न जोड़ा जाता है, जिसके बाद परम = मूल्य जोड़े; उदाहरण में, ?and=a&query=string), तो उन मापदंडों को QUERY_STRING स्क्रिप्ट कहे जाने से पहले परिवेश चर इसमें संग्रहीत किया जाता है। यदि एचटीटीपी पोस्ट अनुरोध के माध्यम से स्क्रिप्ट को मापदंडों भेजे जाते हैं, तो वे स्क्रिप्ट के मानक निविष्टि में पास हो जाते हैं। स्क्रिप्ट तब इन परिवेश चर या मानक निविष्टि से डेटा पढ़ सकती है और वेब ब्राउज़र के अनुरोध के अनुकूल हो सकती है।[8]

उदाहरण

निम्नलिखित पर्ल प्रोग्राम वेब सर्वर द्वारा पास किए गए सभी परिवेश चर दिखाता है:

#!/usr/bin/env perl

=head1 DESCRIPTION

printenv — a CGI program that just prints its environment

=cut
print "Content-Type: text/plain\n\n";

foreach ( sort keys %ENV ) {
    print "$_=\"$ENV{$_}\"\n";
}

यदि कोई वेब ब्राउज़र परिवेश चर के लिए अनुरोध जारी करता है http://example.com/cgi-bin/printenv.pl/foo/bar?var1=value1&var2=with%20percent%20encoding, साइगविन चलाने वाला 64-बिट विंडोज 7 वेब सर्वर निम्नलिखित जानकारी देता है:

COMSPEC="C:\Windows\system32\cmd.exe"
DOCUMENT_ROOT="C:/Program Files (x86)/Apache Software Foundation/Apache2.4/htdocs"
GATEWAY_INTERFACE="CGI/1.1"
HOME="/home/SYSTEM"
HTTP_ACCEPT="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
HTTP_ACCEPT_CHARSET="ISO-8859-1,utf-8;q=0.7,*;q=0.7"
HTTP_ACCEPT_ENCODING="gzip, deflate, br"
HTTP_ACCEPT_LANGUAGE="en-us,en;q=0.5"
HTTP_CONNECTION="keep-alive"
HTTP_HOST="example.com"
HTTP_USER_AGENT="Mozilla/5.0 (Windows NT 6.1; WOW64; rv:67.0) Gecko/20100101 Firefox/67.0"
PATH="/home/SYSTEM/bin:/bin:/cygdrive/c/progra~2/php:/cygdrive/c/windows/system32:..."
PATHEXT=".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC"
PATH_INFO="/foo/bar"
PATH_TRANSLATED="C:\Program Files (x86)\Apache Software Foundation\Apache2.4\htdocs\foo\bar"
QUERY_STRING="var1=value1&var2=with%20percent%20encoding"
REMOTE_ADDR="127.0.0.1"
REMOTE_PORT="63555"
REQUEST_METHOD="GET"
REQUEST_URI="/cgi-bin/printenv.pl/foo/bar?var1=value1&var2=with%20percent%20encoding"
SCRIPT_FILENAME="C:/Program Files (x86)/Apache Software Foundation/Apache2.4/cgi-bin/printenv.pl"
SCRIPT_NAME="/cgi-bin/printenv.pl"
SERVER_ADDR="127.0.0.1"
SERVER_ADMIN="(server admin's email address)"
SERVER_NAME="127.0.0.1"
SERVER_PORT="80"
SERVER_PROTOCOL="HTTP/1.1"
SERVER_SIGNATURE=""
SERVER_SOFTWARE="Apache/2.4.39 (Win32) PHP/7.3.7"
SYSTEMROOT="C:\Windows"
TERM="cygwin"
WINDIR="C:\Windows"

इन चरों में से कुछ, लेकिन सभी नहीं, सीजीआई मानक द्वारा परिभाषित किए गए हैं। कुछ, जैसे PATH_INFO, QUERY_STRING, और से प्रारंभ होने वाले HTTP_, हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल से जानकारी पास करते है।

परिवेश से, यह देखा जा सकता है कि वेब ब्राउज़र फ़ायरफ़ॉक्स विंडोज 7 पीसी पर चल रहा है, वेब सर्वर अपाचे एचटीटीपी सर्वर है जो यूनिक्स का अनुकरण करने वाले सिस्टम पर चल रहा है, और सीजीआई स्क्रिप्ट का नाम cgi-bin/printenv.plहै।

प्रोग्राम तब कोई भी सामग्री उत्पन्न कर सकता है, उसे मानक निर्गम .28stdout.29 पर लिखें, और वेब सर्वर इसे ब्राउज़र पर प्रसारित करता है।

सीजीआई प्रोग्राम्स को पास किए गए परिवेश चर निम्नलिखित हैं:

  • सर्वर विशिष्ट चर:
  • अनुरोध विशिष्ट चर:
    • SERVER_PROTOCOL: एचटीटीपी/संस्करण
    • SERVER_PORT: टीसीपी पोर्ट (दशमलव)।
    • REQUEST_METHOD: एचटीटीपी विधि का नाम (ऊपर देखें)।
    • PATH_INFO: पथ प्रत्यय, यदि प्रोग्राम नाम और स्लैश के बाद यूआरएल में जोड़ा जाता है।
    • PATH_TRANSLATED: संबंधित पूर्ण पथ जैसा कि सर्वर द्वारा माना जाता है, यदि PATH_INFO मौजूद है।
    • SCRIPT_NAME: प्रोग्राम के सापेक्ष पथ, जैसे /cgi-bin/script.cgi.
    • QUERY_STRING: प्रश्नवाचक चिह्न के बाद यूआरएल का भाग ? अक्षर। क्वेरी स्ट्रिंग *name=value जोड़े से बना हो सकता है जो एम्परसेंड से अलग किया गया हो (जैसे var1=val1& var2=val2...) जब एचटीएमएल application/x-www-form-urlencoded द्वारा परिभाषित जीईटीविधि के माध्यम से स्थानांतरित किए गए फॉर्म (वेब) डेटा को प्रस्तुत करने के लिए उपयोग किया जाता है।
    • REMOTE_HOST: क्लाइंट का होस्ट नाम, अगर सर्वर ने ऐसा लुकअप नहीं किया तो अनसेट।
    • REMOTE_ADDR: ग्राहक का आईपी पता (डॉट-दशमलव)।
    • AUTH_TYPE: पहचान प्रकार, यदि लागू हो।
    • REMOTE_USER निश्चित के लिए प्रयोग किया जाता है AUTH_TYPEएस।
    • REMOTE_IDENT: पहचान प्रोटोकॉल देखें, केवल तभी जब सर्वर ने ऐसा लुकअप किया हो।
    • CONTENT_TYPE: इंटरनेट मीडिया प्रकार का निविष्टि डेटा यदि पुट या पोस्ट विधि का उपयोग किया जाता है, जैसा कि एचटीटीपी हेडर के माध्यम से प्रदान किया गया है।
    • CONTENT_LENGTH: इसी तरह, निविष्टि डेटा का आकार (दशमलव, ऑक्टेट में (कंप्यूटिंग)) यदि एचटीटीपी हेडर के माध्यम से प्रदान किया गया हो।
    • उपयोगकर्ता एजेंट द्वारा पारित चर (HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGE, HTTP_USER_AGENT, HTTP_COOKIE और संभवतः अन्य) में संबंधित एचटीटीपी शीर्षलेख के मान होते हैं और इसलिए समान अर्थ होते हैं।

प्रोग्राम वेब सर्वर को मानक निर्गम के रूप में प्रभाव लौटाता है, जिसकी प्रारंभ हेडर और लाइन (टेक्स्ट फ़ाइल) से होती है।

हेडर उसी तरह एन्कोड किया गया है जैसे एचटीटीपी शीर्षलेखों की सूची और लौटाए गए दस्तावेज़ के एमआईएमई प्रकार को शामिल करना चाहिए।[9] हेडर, वेब सर्वर द्वारा पूरक, आम तौर पर प्रतिक्रिया के साथ उपयोगकर्ता को वापस भेज दिए जाते हैं।

यहाँ एचटीएमएल के साथ पायथन 3 में लिखा गया सरल सीजीआई प्रोग्राम है जो साधारण जोड़ समस्या को संभालता है।[10]

add.html:

<!DOCTYPE html>
<html>
 <body>
  <form action="add.cgi" method="POST">
   <fieldset>
     <legend>Enter two numbers to add</legend>
     <label>First Number: <input type="number" name="num1"></label><br/>
     <label>Second Number: <input type="number" name="num2"></label><br/>
   </fieldset>
   <button>Add</button>
  </form>
 </body>
</html>

add.cgi:

#!/usr/bin/env python3

import cgi, cgitb
cgitb.enable()

input_data = cgi.FieldStorage()

print("Content-Type: text/html") # HTML is following
print("")                        # Leave a blank line
print("<h1>Addition Results</h1>")
try:
    num1 = int(input_data["num1"].value)
    num2 = int(input_data["num2"].value)
except:
    print("<output>Sorry, the script cannot turn your inputs into numbers (integers).</output>")
    raise SystemExit(1)
print("<output>{0} + {1} = {2}</output>".format(num1, num2, num1 + num2))

यह पायथन 3 सीजीआई प्रोग्राम एचटीएमएल से निविष्टि प्राप्त करता है और दो संख्याओं को एक साथ जोड़ता है।

परिनियोजन

वेब सर्वर जो सीजीआई का समर्थन करता है उसे यूनिफ़ॉर्म रिसोर्स लोकेटर की व्याख्या करने के लिए समनुरूप किया जा सकता है जो कि सीजीआई स्क्रिप्ट के संदर्भ के रूप में कार्य करता है। एक आम समागम होना है cgi-bin/ डायरेक्टरी ट्री के आधार पर डायरेक्टरी (कंप्यूटिंग) और इस डायरेक्टरी के भीतर सभी निष्पादन योग्य फ़ाइलों (और सुरक्षा के लिए कोई अन्य नहीं) को सीजीआई स्क्रिप्ट के रूप में मानें जाते है। फ़ाइल नाम एक्सटेंशन का उपयोग करना अन्य लोकप्रिय समागम है; उदाहरण के लिए, यदि सीजीआई स्क्रिप्ट को लगातार विस्तार .cgi दिया जाता है , वेब सर्वर को सीजीआई स्क्रिप्ट के रूप में ऐसी सभी फाइलों की व्याख्या करने के लिए समनुरूप किया जा सकता है। जबकि सुविधाजनक, और कई प्रीपैक्ड स्क्रिप्ट्स के लिए आवश्यक है, यह हमला करने के लिए सर्वर को खोलता है यदि कोई दूरस्थ उपयोगकर्ता निष्पादन योग्य कोड को उचित एक्सटेंशन के साथ अपलोड कर सकता है।

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

उपयोग

सीजीआई का उपयोग अक्सर उपयोगकर्ता से निविष्टि जानकारी को प्रोसेस करने और उचित निर्गम देने के लिए किया जाता है। सीजीआई प्रोग्राम का एक उदाहरण एक सप्ताह को लागू करना है। यदि उपयोगकर्ता एजेंट किसी प्रविष्टि के नाम का अनुरोध करता है, तो वेब सर्वर सीजीआई प्रोग्राम को निष्पादित करता है। सीजीआई प्रोग्राम उस प्रविष्टि के पृष्ठ के स्रोत को पुनः प्राप्त करता है (यदि कोई मौजूद है), इसे एचटीएमएल में रूपांतरित करता है, और प्रभाव को प्रिंट करता है। वेब सर्वर सीजीआई प्रोग्राम से निर्गम प्राप्त करता है और इसे उपयोगकर्ता एजेंट को भेजता है। फिर यदि उपयोगकर्ता एजेंट पृष्ठ संपादित करें बटन पर क्लिक करता है, तो सीजीआई प्रोग्राम एक एचटीएमएल पॉप्युलेट करता है textarea या पृष्ठ की सामग्री के साथ अन्य संपादन नियंत्रण। अंत में यदि उपयोगकर्ता एजेंट पब्लिश पेज बटन पर क्लिक करता है, तो सीजीआई प्रोग्राम अपडेट किए गए एचटीएमएल को उस प्रविष्टि के पेज के स्रोत में बदल देता है और उसे सहेज लेता है।

सुरक्षा

सीजीआई प्रोग्राम डिफ़ॉल्ट रूप से वेब सर्वर के सुरक्षा संदर्भ में चलते हैं। जब पहली बार प्रस्तुत किया गया तो एनसीएसए, Apache और CERN वेब सर्वर के संदर्भ वितरण के साथ कई उदाहरण स्क्रिप्ट प्रदान किए गए थे ताकि यह दिखाया जा सके कि नए सीजीआई का उपयोग करने के लिए शेल स्क्रिप्ट या C प्रोग्राम को कैसे कोडित किया जा सकता है। ऐसा ही एक उदाहरण स्क्रिप्ट PHF नामक एक सीजीआई प्रोग्राम था जिसने एक साधारण फोन बुक लागू की।

उस समय की कई अन्य स्क्रिप्ट के साथ आम तौर पर, इस स्क्रिप्ट ने एक फ़ंक्शन का उपयोग किया: escape_shell_cmd(). फ़ंक्शन को अपने तर्क को साफ करना था, जो उपयोगकर्ता निविष्टि से आया था और फिर वेब सर्वर के सुरक्षा संदर्भ में चलाने के लिए यूनिक्स शेल में निविष्टि पास करता था। स्क्रिप्ट ने सभी निविष्टि को सही ढंग से स्वच्छ नहीं किया और शेल में नई लाइनों को पारित करने की अनुमति दी, जिसने प्रभावी रूप से कई कमांड को चलाने की अनुमति दी। इन आदेशों के प्रभाव तब वेब सर्वर पर प्रदर्शित किए गए थे। यदि वेब सर्वर के सुरक्षा संदर्भ ने इसकी अनुमति दी है, तो हमलावरों द्वारा दुर्भावनापूर्ण आदेश निष्पादित किए जा सकते हैं।

यह एक कोड इंजेक्शन का पहला व्यापक उदाहरण था, जहां वेब उपयोगकर्ताओं के असंक्रमित डेटा से वेब सर्वर पर कोड का निष्पादन हो सकता है। क्योंकि उदाहरण कोड डिफ़ॉल्ट रूप से स्थापित किया गया था, हमले व्यापक थे और 1996 की प्रारंभ में कई सुरक्षा सलाहकारों का नेतृत्व किया।[11]


विकल्प

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

सीजीआई प्रक्रिया निर्माण और विनाश में शामिल कम्प्यूटेशनल ओवरहेड को निम्नलिखित तकनीकों से कम किया जा सकता है:

  • सीजीआई प्रोग्राम मशीन कोड के लिए पूर्वसंकलित होते हैं, उदा. वर्चुअल मशीन द्वारा व्याख्या किए गए सीजीआई प्रोग्राम के बजाय C (प्रोग्रामिंग लैंग्वेज) या C ++ प्रोग्राम से पहले से संकलित, उदाहरण पर्ल, पीएचपी या पायथन (प्रोग्रामिंग भाषा) प्रोग्राम।
  • वेब सर्वर एक्सटेंशन जैसे कि अपाचे मॉड्यूल (जैसे mod_perl, mod_php, mod_python), नेटस्केप सर्वर एप्लीकेशन प्रोग्रामिंग इंटरफ़ेस प्लगइन्स, और ISAPI प्लगइन्स जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को संभालने और वेब सर्वर के भीतर होस्ट करने की अनुमति देते हैं। वेब 2.0 क्लाइंट से डेटा को एचटीएमएल फॉर्म का उपयोग किए बिना और उपयोगकर्ता को नोटिस किए बिना सर्वर में स्थानांतरित करने की अनुमति देता है।[12]
  • FastCGI, सरल सामान्य गेटवे इंटरफ़ेस, और Apache JServ प्रोटोकॉल जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को बाहरी रूप से होस्ट करने की अनुमति देता है; यानी, वेब सर्वर से अलग। प्रत्येक आवेदन प्रक्रिया एक सॉकेट पर सुनती है; वेब सर्वर एक हाइपरटेक्स्ट ट्रांसफर प्रोटोकॉल को संभालता है और इसे दूसरे प्रोटोकॉल (FastCGI, SCGI या AJP) के माध्यम से केवल गतिशील सामग्री के लिए सॉकेट में भेजता है, जबकि स्थैतिक सामग्री को आमतौर पर सीधे वेब सर्वर द्वारा नियंत्रित किया जाता है। इस दृष्टिकोण को कम अनुप्रयोग प्रक्रियाओं की आवश्यकता होती है इसलिए वेब सर्वर एक्सटेंशन दृष्टिकोण की तुलना में कम मेमोरी की खपत होती है। और एप्लिकेशन प्रोग्राम को वेब सर्वर एक्सटेंशन में बदलने के विपरीत, FastCGI, SCGI और AJP एप्लिकेशन प्रोग्राम वेब सर्वर से स्वतंत्र रहते हैं।
  • जकार्ता ी गतिशील सामग्री और वैकल्पिक रूप से स्थिर सामग्री की सेवा के लिए एक वेब कंटेनर में जकार्ता सर्वलेट एप्लिकेशन चलाता है जो थ्रेड (कंप्यूटर विज्ञान) बनाने और नष्ट करने के बहुत कम ओवरहेड के साथ प्रक्रियाओं को बनाने और नष्ट करने के ओवरहेड को बदल देता है। यह प्रोग्रामर को जावा प्लेटफॉर्म, मानक संस्करण के साथ आने वाली लाइब्रेरी के लिए भी उजागर करता है, जिस पर जकार्ता ईई का उपयोग किया जाने वाला संस्करण आधारित है।

किसी भी वेब एप्लिकेशन के लिए इष्टतम कॉन्फ़िगरेशन एप्लिकेशन-विशिष्ट विवरण, ट्रैफ़िक की मात्रा और लेन-देन की जटिलता पर निर्भर करता है; किसी दिए गए कार्य और समय बजट के लिए सर्वोत्तम कार्यान्वयन निर्धारित करने के लिए इन ट्रेड-ऑफ़ का विश्लेषण करने की आवश्यकता है। वेब ढांचे उपयोगकर्ता एजेंटों के साथ बातचीत करने के लिए सीजीआई स्क्रिप्ट का उपयोग करने का विकल्प प्रदान करते हैं।

यह भी देखें

संदर्भ

  1. Robinson <drtr@apache.org>, David. "कॉमन गेटवे इंटरफ़ेस (CGI) संस्करण 1.1". tools.ietf.org (in English). Retrieved 2021-02-16.
  2. Robinson <drtr@apache.org>, David. "कॉमन गेटवे इंटरफ़ेस (CGI) संस्करण 1.1". tools.ietf.org (in English). Archived from the original on 11 February 2007. Retrieved 2021-02-16.
  3. 3.0 3.1 3.2 "RFC3875: The Common Gateway Interface (CGI) Version 1.1".
  4. "कॉमन गेटवे इंटरफ़ेस". hoohoo.ncsa.uiuc.edu. National Center for Supercomputing Applications (NCSA). Archived from the original on 2010-01-27.
  5. "CGI: Common Gateway Interface". w3.org. World Wide Web Consortium. Retrieved 2019-05-15.
  6. "कॉमन गेटवे इंटरफ़ेस RFC प्रोजेक्ट पेज". Archived from the original on 2013-08-25.
  7. "Mapping URLs to Filesystem Locations Apache HTTP Server Version 2.2".
  8. Nelson, Anne Fulcher, and Nelson, William Harris Morehead. (2001). Building Electronic Commerce with Web Database Constructions. Boston, MA: Addison Wesley.
  9. "CGI Primer (Mirror at citycat.ru)".
  10. "Abacles HTML प्रपत्र". www.abacles.com. Archived from the original on 19 April 2016. Retrieved 2016-04-06.
  11. "phf CGI स्क्रिप्ट न्यूलाइन वर्णों से बचाव करने में विफल रहती है". Software Engineering Institute CERT Coordination Center. Retrieved 21 November 2019.
  12. Enrico Marino (11 September 2018). वितरित वेब में सूचना प्रबंधन (PDF) (phd). Roma Tre University. Archived (PDF) from the original on 2019-02-12. Retrieved 11 February 2019.


बाहरी संबंध