कॉमन गेटवे इंटरफ़ेस
कम्प्यूटिंग में, कॉमन गेटवे इंटरफ़ेस (CGI) एक इंटरफ़ेस विनिर्देश है जो वेब सर्वर को बाहरी प्रोग्राम निष्पादित करने में सक्षम बनाता है, आमतौर पर उपयोगकर्ता अनुरोधों को संसाधित करने के लिए।[1] ऐसे प्रोग्राम अक्सर एक स्क्रिप्टिंग भाषा में लिखे जाते हैं और आमतौर पर सीजीआई स्क्रिप्ट के रूप में संदर्भित होते हैं, लेकिन इनमें संकलक प्रोग्राम शामिल हो सकते हैं।[2] एक विशिष्ट उपयोग का मामला तब होता है जब एक वेब उपयोगकर्ता CGI का उपयोग करने वाले वेब पेज पर एक वेब फार्म सबमिट करता है। प्रपत्र का डेटा एक HTTP अनुरोध के भीतर वेब सर्वर पर भेजा जाता है, जिसमें CGI स्क्रिप्ट को दर्शाने वाला URL होता है। वेब सर्वर तब सीजीआई स्क्रिप्ट को एक नई कंप्यूटर प्रक्रिया में लॉन्च करता है, इसमें फॉर्म डेटा पास करता है। CGI स्क्रिप्ट का आउटपुट, आमतौर पर HTML के रूप में, स्क्रिप्ट द्वारा वेब सर्वर को लौटाया जाता है, और सर्वर इसे ब्राउज़र पर वापस भेज देता है क्योंकि ब्राउज़र के अनुरोध पर इसकी HTTP प्रतिक्रिया होती है।[3] 1990 के दशक की शुरुआत में विकसित, CGI सबसे शुरुआती सामान्य तरीका था जो एक वेब पेज को इंटरएक्टिव होने की अनुमति देता था।
इतिहास
1993 में, सुपरकंप्यूटिंग अनुप्रयोगों के लिए राष्ट्रीय केंद्र (NCSA) टीम ने www-टॉक मेलिंग सूची पर कमांड लाइन एक्जीक्यूटेबल्स को कॉल करने के लिए विनिर्देश लिखा।[4][5][6] अन्य वेब सर्वर डेवलपर्स ने इसे अपनाया, और तब से यह वेब सर्वर के लिए एक मानक बना हुआ है। सीजीआई की एनसीएसए परिभाषा को और अधिक औपचारिक रूप से परिभाषित करने के लिए नवंबर 1997 में और कोअर की अध्यक्षता में एक कार्य समूह शुरू हुआ।[7] इस कार्य के परिणामस्वरूप RFC 3875 प्राप्त हुआ, जो CGI संस्करण 1.1 निर्दिष्ट करता है। RFC में विशेष रूप से उल्लिखित निम्नलिखित योगदानकर्ता हैं:[3]* रोब मैककूल (NCSA HTTPd वेब सर्वर के लेखक)
- जॉन फ्रैंक्स (जीएन वेब सर्वर के लेखक)
- अरी लुओटोनेन (सर्न httpd वेब सर्वर के विकासकर्ता)
- टोनी सैंडर्स (प्लेक्सस वेब सर्वर के लेखक)
- जॉर्ज फिलिप्स (ब्रिटिश कोलंबिया विश्वविद्यालय में वेब सर्वर मेंटेनर)
ऐतिहासिक रूप से CGI प्रोग्राम अक्सर सी प्रोग्रामिंग भाषा का उपयोग करके लिखे जाते थे। RFC 3875 कॉमन गेटवे इंटरफ़ेस (CGI) आंशिक रूप से C का उपयोग करके CGI को परिभाषित करता है,[3]यह कहते हुए कि सी पुस्तकालय रूटीन गेटेनव () या वेरिएबल एनवायरन द्वारा पर्यावरण चर का उपयोग किया जाता है।
CGI नाम वेब के शुरुआती दिनों से आया है, जहाँ वेबमास्टर डेटाबेस जैसी विरासत सूचना प्रणाली को अपने वेब सर्वर से जोड़ना चाहते थे। CGI प्रोग्राम को सर्वर द्वारा निष्पादित किया गया था जो वेब सर्वर और लीगेसी सूचना प्रणाली के बीच एक सामान्य गेटवे प्रदान करता था।
सीजीआई विनिर्देश का उद्देश्य
प्रत्येक वेब सर्वर HTTP सर्वर सॉफ़्टवेयर चलाता है, जो वेब ब्राउज़रों के अनुरोधों का जवाब देता है। आम तौर पर, HTTP सर्वर में एक डायरेक्टरी (कंप्यूटिंग) | डायरेक्टरी (फ़ोल्डर) होती है, जिसे दस्तावेज़ संग्रह के रूप में नामित किया जाता है - ऐसी फ़ाइलें जिन्हें इस सर्वर से जुड़े वेब ब्राउज़रों को भेजा जा सकता है।[8] उदाहरण के लिए, यदि वेब सर्वर का डोमेन नाम है example.com
, और इसका दस्तावेज़ संग्रह पर संग्रहीत है /usr/local/apache/htdocs/
स्थानीय फाइल सिस्टम में, तब वेब सर्वर अनुरोध का जवाब देगा http://example.com/index.html
ब्राउज़र को (पूर्व-लिखित) फ़ाइल भेजकर /usr/local/apache/htdocs/index.html
.
फ्लाई पर बनाए गए पृष्ठों के लिए, सर्वर सॉफ़्टवेयर अलग-अलग प्रोग्रामों के अनुरोधों को स्थगित कर सकता है और अनुरोध करने वाले क्लाइंट को परिणाम रिले कर सकता है (आमतौर पर, एक वेब ब्राउज़र जो पृष्ठ को अंतिम उपयोगकर्ता को प्रदर्शित करता है)। वेब के शुरुआती दिनों में, ऐसे प्रोग्राम आमतौर पर छोटे होते थे और स्क्रिप्टिंग भाषा में लिखे जाते थे; इसलिए, उन्हें स्क्रिप्ट के रूप में जाना जाता था।
ऐसे कार्यक्रमों के लिए आमतौर पर अनुरोध के साथ निर्दिष्ट की जाने वाली कुछ अतिरिक्त जानकारी की आवश्यकता होती है। उदाहरण के लिए, यदि विकिपीडिया को एक स्क्रिप्ट के रूप में लागू किया गया था, तो स्क्रिप्ट को यह जानने की आवश्यकता होगी कि क्या उपयोगकर्ता लॉग इन है और यदि लॉग इन है, तो किस नाम से। विकिपीडिया पृष्ठ के शीर्ष पर मौजूद सामग्री इस जानकारी पर निर्भर करती है।
HTTP वेब सर्वर को ऐसी जानकारी पास करने के लिए ब्राउज़रों को तरीके प्रदान करता है, उदा। यूआरएल के हिस्से के रूप में। सर्वर सॉफ़्टवेयर को इस जानकारी को किसी तरह स्क्रिप्ट के माध्यम से पास करना चाहिए।
इसके विपरीत, लौटने पर, स्क्रिप्ट को अनुरोध के जवाब के लिए HTTP द्वारा आवश्यक सभी जानकारी प्रदान करनी चाहिए: अनुरोध की HTTP स्थिति, दस्तावेज़ सामग्री (यदि उपलब्ध हो), दस्तावेज़ प्रकार (जैसे HTML, PDF, या सादा पाठ) , वगैरह।
प्रारंभ में, अलग-अलग सर्वर सॉफ़्टवेयर इस जानकारी को स्क्रिप्ट के साथ आदान-प्रदान करने के लिए अलग-अलग तरीकों का उपयोग करेंगे। नतीजतन, ऐसी स्क्रिप्ट लिखना संभव नहीं था जो अलग-अलग सर्वर सॉफ़्टवेयर के लिए अपरिवर्तित काम करे, भले ही आदान-प्रदान की जाने वाली जानकारी समान थी। इसलिए, इस जानकारी के आदान-प्रदान के लिए एक तरीका निर्दिष्ट करने का निर्णय लिया गया: CGI (कॉमन गेटवे इंटरफ़ेस, क्योंकि यह सर्वर सॉफ़्टवेयर के लिए स्क्रिप्ट के साथ इंटरफ़ेस करने का एक सामान्य तरीका परिभाषित करता है)। सीजीआई विनिर्देश के अनुसार काम करने वाले सर्वर सॉफ़्टवेयर द्वारा शुरू किए गए वेबपेज जनरेटिंग प्रोग्राम को सीजीआई स्क्रिप्ट के रूप में जाना जाता है।
यह विनिर्देश जल्दी से अपनाया गया था और अभी भी सभी प्रसिद्ध सर्वर सॉफ़्टवेयर द्वारा समर्थित है, जैसे Apache HTTP सर्वर, इंटरनेट सूचना सेवाएँ, और (विस्तार के साथ) नोड.जेएस-आधारित सर्वर।
सीजीआई लिपियों का प्रारंभिक उपयोग प्रपत्रों को संसाधित करने के लिए किया गया था। HTML की शुरुआत में, HTML फॉर्म में आमतौर पर एक एक्शन एट्रिब्यूट और सबमिट बटन के रूप में नामित एक बटन होता था। जब सबमिट बटन को धक्का दिया जाता है तो कार्रवाई विशेषता में निर्दिष्ट यूआरआई क्वेरी स्ट्रिंग के रूप में भेजे गए फॉर्म से डेटा के साथ सर्वर को भेजा जाएगा। यदि क्रिया एक सीजीआई स्क्रिप्ट निर्दिष्ट करती है तो सीजीआई स्क्रिप्ट निष्पादित की जाएगी और फिर यह एक HTML पेज बनाती है।
सीजीआई स्क्रिप्ट का प्रयोग
एक वेब सर्वर अपने मालिक को यह कॉन्फ़िगर करने की अनुमति देता है कि कौन से यूआरएल को किस सीजीआई स्क्रिप्ट द्वारा नियंत्रित किया जाएगा।
यह आमतौर पर दस्तावेज़ संग्रह के भीतर एक नई निर्देशिका को CGI स्क्रिप्ट वाले के रूप में चिह्नित करके किया जाता है - इसका नाम अक्सर होता है cgi-bin
. उदाहरण के लिए, /usr/local/apache/htdocs/cgi-bin
वेब सर्वर पर CGI निर्देशिका के रूप में नामित किया जा सकता है। जब एक वेब ब्राउजर एक यूआरएल का अनुरोध करता है जो सीजीआई निर्देशिका के भीतर एक फाइल को इंगित करता है (उदाहरण के लिए, http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string
), फिर, केवल उस फ़ाइल को भेजने के बजाय (/usr/local/apache/htdocs/cgi-bin/printenv.pl
) वेब ब्राउजर पर, HTTP सर्वर निर्दिष्ट स्क्रिप्ट चलाता है और स्क्रिप्ट के आउटपुट को वेब ब्राउजर को पास करता है। अर्थात्, स्क्रिप्ट द्वारा मानक आउटपुट पर भेजी जाने वाली कोई भी चीज़ टर्मिनल विंडो में ऑन-स्क्रीन दिखाए जाने के बजाय वेब क्लाइंट को भेज दी जाती है।
जैसा कि ऊपर बताया गया है, सीजीआई विनिर्देश परिभाषित करता है कि अनुरोध के साथ पास की गई अतिरिक्त जानकारी स्क्रिप्ट को कैसे पास की जाती है।
उदाहरण के लिए, यदि एक स्लैश और अतिरिक्त निर्देशिका नाम स्क्रिप्ट के नाम के ठीक बाद URL में जोड़े जाते हैं (इस उदाहरण में, /with/additional/path
), तो वह पथ में संग्रहीत है PATH_INFO
स्क्रिप्ट कहे जाने से पहले पर्यावरण चर। यदि स्क्रिप्ट को HTTP GET अनुरोध के माध्यम से पैरामीटर भेजे जाते हैं (URL में एक प्रश्न चिह्न जोड़ा जाता है, जिसके बाद param=value जोड़े; उदाहरण में, ?and=a&query=string
), तो उन मापदंडों को इसमें संग्रहीत किया जाता है QUERY_STRING
स्क्रिप्ट कहे जाने से पहले पर्यावरण चर। यदि HTTP POST अनुरोध के माध्यम से स्क्रिप्ट को पैरामीटर भेजे जाते हैं, तो वे स्क्रिप्ट के मानक इनपुट में पास हो जाते हैं। स्क्रिप्ट तब इन पर्यावरण चर या मानक इनपुट से डेटा पढ़ सकती है और वेब ब्राउज़र के अनुरोध के अनुकूल हो सकती है।[9]
उदाहरण
निम्नलिखित पर्ल प्रोग्राम वेब सर्वर द्वारा पास किए गए सभी पर्यावरण चर दिखाता है:
#!/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"
इन चरों में से कुछ, लेकिन सभी नहीं, CGI मानक द्वारा परिभाषित किए गए हैं।
कुछ, जैसे PATH_INFO
, QUERY_STRING
, और से शुरू होने वाले HTTP_
, HTTP अनुरोध से जानकारी पास करें।
पर्यावरण से, यह देखा जा सकता है कि वेब ब्राउज़र फ़ायरफ़ॉक्स विंडोज 7 पीसी पर चल रहा है, वेब सर्वर अपाचे HTTP सर्वर है जो यूनिक्स का अनुकरण करने वाले सिस्टम पर चल रहा है, और सीजीआई स्क्रिप्ट का नाम है cgi-bin/printenv.pl
.
कार्यक्रम तब कोई भी सामग्री उत्पन्न कर सकता है, उसे मानक धाराओं #मानक आउटपुट .28stdout.29 पर लिखें, और वेब सर्वर इसे ब्राउज़र पर प्रसारित करेगा।
CGI प्रोग्राम्स को पास किए गए पर्यावरण चर निम्नलिखित हैं:
- सर्वर विशिष्ट चर:
SERVER_SOFTWARE
: HTTP सर्वर का नाम/संस्करण।SERVER_NAME
: सर्वर का मेजबान का नाम, डॉट-दशमलव अंकन हो सकता है | डॉट-दशमलव आईपी पता।GATEWAY_INTERFACE
: CGI/संस्करण।
- अनुरोध विशिष्ट चर:
SERVER_PROTOCOL
: HTTP/संस्करण।SERVER_PORT
: टीसीपी पोर्ट (दशमलव)।REQUEST_METHOD
: HTTP विधि का नाम (ऊपर देखें)।PATH_INFO
: पथ प्रत्यय, यदि प्रोग्राम नाम और स्लैश के बाद URL में जोड़ा जाता है।PATH_TRANSLATED
: संबंधित पूर्ण पथ जैसा कि सर्वर द्वारा माना जाता है, यदिPATH_INFO
मौजूद है।SCRIPT_NAME
: कार्यक्रम के सापेक्ष पथ, जैसे/cgi-bin/script.cgi
.QUERY_STRING
: प्रश्नवाचक चिह्न के बाद URL का भाग|? अक्षर। क्वेरी स्ट्रिंग *name=value जोड़े से बना हो सकता है जो एम्परसेंड से अलग किया गया हो (जैसे var1=val1& var2=val2...) जब HTML application/x-www-form-urlencoded द्वारा परिभाषित GET विधि के माध्यम से स्थानांतरित किए गए फॉर्म (वेब) डेटा को सबमिट करने के लिए उपयोग किया जाता है।REMOTE_HOST
: क्लाइंट का होस्ट नाम, अगर सर्वर ने ऐसा लुकअप नहीं किया तो अनसेट।REMOTE_ADDR
: ग्राहक का आईपी पता (डॉट-दशमलव)।AUTH_TYPE
: पहचान प्रकार, यदि लागू हो।REMOTE_USER
निश्चित के लिए प्रयोग किया जाता हैAUTH_TYPE
एस।REMOTE_IDENT
: पहचान प्रोटोकॉल देखें, केवल तभी जब सर्वर ने ऐसा लुकअप किया हो।CONTENT_TYPE
: इंटरनेट मीडिया प्रकार का इनपुट डेटा यदि PUT या POST विधि का उपयोग किया जाता है, जैसा कि HTTP हेडर के माध्यम से प्रदान किया गया है।CONTENT_LENGTH
: इसी तरह, इनपुट डेटा का आकार (दशमलव, ऑक्टेट में (कंप्यूटिंग)) यदि HTTP हेडर के माध्यम से प्रदान किया गया हो।- उपयोगकर्ता एजेंट द्वारा पारित चर (
HTTP_ACCEPT
,HTTP_ACCEPT_LANGUAGE
,HTTP_USER_AGENT
,HTTP_COOKIE
और संभवतः अन्य) में संबंधित HTTP शीर्षलेखों के मान होते हैं और इसलिए समान अर्थ होते हैं।
प्रोग्राम वेब सर्वर को मानक आउटपुट के रूप में परिणाम लौटाता है, जिसकी शुरुआत हेडर और लाइन (पाठ फ़ाइल) से होती है।
हेडर उसी तरह एन्कोड किया गया है जैसे HTTP शीर्षलेखों की सूची और लौटाए गए दस्तावेज़ के एमआईएमई प्रकार को शामिल करना चाहिए।[10] हेडर, वेब सर्वर द्वारा पूरक, आम तौर पर प्रतिक्रिया के साथ उपयोगकर्ता को वापस भेज दिए जाते हैं।
यहाँ HTML के साथ Python 3 में लिखा गया एक सरल CGI प्रोग्राम है जो एक साधारण जोड़ समस्या को संभालता है।[11]
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))
यह Python 3 CGI प्रोग्राम HTML से इनपुट प्राप्त करता है और दो संख्याओं को एक साथ जोड़ता है।
परिनियोजन
एक वेब सर्वर जो सीजीआई का समर्थन करता है उसे यूनिफ़ॉर्म रिसोर्स लोकेटर की व्याख्या करने के लिए कॉन्फ़िगर किया जा सकता है जो कि सीजीआई स्क्रिप्ट के संदर्भ के रूप में कार्य करता है। एक आम सम्मेलन एक होना है cgi-bin/
निर्देशिका पेड़ के आधार पर निर्देशिका (कंप्यूटिंग) और इस निर्देशिका के भीतर सभी निष्पादन योग्य फ़ाइलों (और सुरक्षा के लिए कोई अन्य नहीं) को सीजीआई स्क्रिप्ट के रूप में मानें। फ़ाइल नाम एक्सटेंशन का उपयोग करना एक अन्य लोकप्रिय परंपरा है; उदाहरण के लिए, यदि CGI स्क्रिप्ट को लगातार विस्तार दिया जाता है .cgi
, वेब सर्वर को सीजीआई स्क्रिप्ट के रूप में ऐसी सभी फाइलों की व्याख्या करने के लिए कॉन्फ़िगर किया जा सकता है। जबकि सुविधाजनक, और कई प्रीपैक्ड स्क्रिप्ट्स के लिए आवश्यक है, यह हमला करने के लिए सर्वर को खोलता है यदि कोई दूरस्थ उपयोगकर्ता निष्पादन योग्य कोड को उचित एक्सटेंशन के साथ अपलोड कर सकता है।
HTTP#Request विधियों के मामले में, उपयोगकर्ता द्वारा सबमिट किया गया डेटा मानक इनपुट के माध्यम से प्रोग्राम को प्रदान किया जाता है। वेब सर्वर इसे पास किए गए पर्यावरण चर का एक सबसेट बनाता है और HTTP वातावरण से संबंधित विवरण जोड़ता है।
उपयोग
CGI का उपयोग अक्सर उपयोगकर्ता से इनपुट जानकारी को प्रोसेस करने और उचित आउटपुट देने के लिए किया जाता है। सीजीआई कार्यक्रम का एक उदाहरण एक सप्ताह को लागू करना है। यदि उपयोगकर्ता एजेंट किसी प्रविष्टि के नाम का अनुरोध करता है, तो वेब सर्वर CGI प्रोग्राम को निष्पादित करता है। CGI प्रोग्राम उस प्रविष्टि के पृष्ठ के स्रोत को पुनः प्राप्त करता है (यदि कोई मौजूद है), इसे HTML में रूपांतरित करता है, और परिणाम को प्रिंट करता है। वेब सर्वर CGI प्रोग्राम से आउटपुट प्राप्त करता है और इसे उपयोगकर्ता एजेंट को भेजता है। फिर यदि उपयोगकर्ता एजेंट पृष्ठ संपादित करें बटन पर क्लिक करता है, तो CGI प्रोग्राम एक HTML पॉप्युलेट करता है textarea
या पृष्ठ की सामग्री के साथ अन्य संपादन नियंत्रण। अंत में यदि उपयोगकर्ता एजेंट पब्लिश पेज बटन पर क्लिक करता है, तो CGI प्रोग्राम अपडेट किए गए HTML को उस प्रविष्टि के पेज के स्रोत में बदल देता है और उसे सहेज लेता है।
सुरक्षा
CGI प्रोग्राम डिफ़ॉल्ट रूप से वेब सर्वर के सुरक्षा संदर्भ में चलते हैं। जब पहली बार प्रस्तुत किया गया तो NCSA, Apache और CERN वेब सर्वर के संदर्भ वितरण के साथ कई उदाहरण स्क्रिप्ट प्रदान किए गए थे ताकि यह दिखाया जा सके कि नए CGI का उपयोग करने के लिए शेल स्क्रिप्ट या C प्रोग्राम को कैसे कोडित किया जा सकता है। ऐसा ही एक उदाहरण स्क्रिप्ट PHF नामक एक CGI प्रोग्राम था जिसने एक साधारण फोन बुक लागू की।
उस समय की कई अन्य लिपियों के साथ आम तौर पर, इस स्क्रिप्ट ने एक फ़ंक्शन का उपयोग किया: escape_shell_cmd()
. फ़ंक्शन को अपने तर्क को साफ करना था, जो उपयोगकर्ता इनपुट से आया था और फिर वेब सर्वर के सुरक्षा संदर्भ में चलाने के लिए यूनिक्स शेल में इनपुट पास करता था। स्क्रिप्ट ने सभी इनपुट को सही ढंग से स्वच्छ नहीं किया और शेल में नई लाइनों को पारित करने की अनुमति दी, जिसने प्रभावी रूप से कई कमांड को चलाने की अनुमति दी। इन आदेशों के परिणाम तब वेब सर्वर पर प्रदर्शित किए गए थे। यदि वेब सर्वर के सुरक्षा संदर्भ ने इसकी अनुमति दी है, तो हमलावरों द्वारा दुर्भावनापूर्ण आदेश निष्पादित किए जा सकते हैं।
यह एक कोड इंजेक्शन का पहला व्यापक उदाहरण था, जहां वेब उपयोगकर्ताओं के असंक्रमित डेटा से वेब सर्वर पर कोड का निष्पादन हो सकता है। क्योंकि उदाहरण कोड डिफ़ॉल्ट रूप से स्थापित किया गया था, हमले व्यापक थे और 1996 की शुरुआत में कई सुरक्षा सलाहकारों का नेतृत्व किया।[12]
विकल्प
प्रत्येक आने वाले HTTP अनुरोध के लिए, एक वेब सर्वर इसे संभालने के लिए एक नई CGI प्रक्रिया (कंप्यूटिंग) बनाता है और HTTP अनुरोध को संभालने के बाद CGI प्रक्रिया को नष्ट कर देता है। एक प्रक्रिया को बनाने और नष्ट करने से प्रक्रिया के आउटपुट को उत्पन्न करने के वास्तविक कार्य की तुलना में बहुत अधिक CPU और मेमोरी की खपत हो सकती है, खासकर जब CGI प्रोग्राम को अभी भी एक वर्चुअल मशीन द्वारा व्याख्या करने की आवश्यकता होती है। उच्च संख्या में HTTP अनुरोधों के लिए, परिणामी कार्यभार वेब सर्वर को जल्दी से अभिभूत कर सकता है।
सीजीआई प्रक्रिया निर्माण और विनाश में शामिल कम्प्यूटेशनल ओवरहेड को निम्नलिखित तकनीकों से कम किया जा सकता है:
- CGI प्रोग्राम मशीन कोड के लिए पूर्वसंकलित होते हैं, उदा. वर्चुअल मशीन द्वारा व्याख्या किए गए CGI प्रोग्राम के बजाय C (प्रोग्रामिंग लैंग्वेज) या C ++ प्रोग्राम से पहले से संकलित, उदा। पर्ल, पीएचपी या पायथन (प्रोग्रामिंग भाषा) प्रोग्राम।
- वेब सर्वर एक्सटेंशन जैसे कि अपाचे मॉड्यूल (जैसे mod_perl, mod_php, mod_python), नेटस्केप सर्वर एप्लीकेशन प्रोग्रामिंग इंटरफ़ेस प्लगइन्स, और ISAPI प्लगइन्स जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को संभालने और वेब सर्वर के भीतर होस्ट करने की अनुमति देते हैं। वेब 2.0 क्लाइंट से डेटा को HTML फॉर्म का उपयोग किए बिना और उपयोगकर्ता को नोटिस किए बिना सर्वर में स्थानांतरित करने की अनुमति देता है।[13]
- FastCGI, सरल सामान्य गेटवे इंटरफ़ेस, और Apache JServ प्रोटोकॉल जो लंबे समय तक चलने वाली एप्लिकेशन प्रक्रियाओं को एक से अधिक अनुरोधों को बाहरी रूप से होस्ट करने की अनुमति देता है; यानी, वेब सर्वर से अलग। प्रत्येक आवेदन प्रक्रिया एक सॉकेट पर सुनती है; वेब सर्वर एक HTTP अनुरोध को संभालता है और इसे दूसरे प्रोटोकॉल (FastCGI, SCGI या AJP) के माध्यम से केवल गतिशील सामग्री के लिए सॉकेट में भेजता है, जबकि स्थैतिक सामग्री को आमतौर पर सीधे वेब सर्वर द्वारा नियंत्रित किया जाता है। इस दृष्टिकोण को कम अनुप्रयोग प्रक्रियाओं की आवश्यकता होती है इसलिए वेब सर्वर एक्सटेंशन दृष्टिकोण की तुलना में कम मेमोरी की खपत होती है। और एप्लिकेशन प्रोग्राम को वेब सर्वर एक्सटेंशन में बदलने के विपरीत, FastCGI, SCGI और AJP एप्लिकेशन प्रोग्राम वेब सर्वर से स्वतंत्र रहते हैं।
- जकार्ता ी गतिशील सामग्री और वैकल्पिक रूप से स्थिर सामग्री की सेवा के लिए एक वेब कंटेनर में जकार्ता सर्वलेट एप्लिकेशन चलाता है जो थ्रेड (कंप्यूटर विज्ञान) बनाने और नष्ट करने के बहुत कम ओवरहेड के साथ प्रक्रियाओं को बनाने और नष्ट करने के ओवरहेड को बदल देता है। यह प्रोग्रामर को जावा प्लेटफॉर्म, मानक संस्करण के साथ आने वाली लाइब्रेरी के लिए भी उजागर करता है, जिस पर जकार्ता ईई का उपयोग किया जाने वाला संस्करण आधारित है।
किसी भी वेब एप्लिकेशन के लिए इष्टतम कॉन्फ़िगरेशन एप्लिकेशन-विशिष्ट विवरण, ट्रैफ़िक की मात्रा और लेन-देन की जटिलता पर निर्भर करता है; किसी दिए गए कार्य और समय बजट के लिए सर्वोत्तम कार्यान्वयन निर्धारित करने के लिए इन ट्रेड-ऑफ़ का विश्लेषण करने की आवश्यकता है। वेब ढांचे उपयोगकर्ता एजेंटों के साथ बातचीत करने के लिए सीजीआई स्क्रिप्ट का उपयोग करने का विकल्प प्रदान करते हैं।
यह भी देखें
- सीजीआई.पी.एम
- डॉस गेटवे इंटरफ़ेस (डीजीआई)
- फास्टसीजीआई
- पर्ल वेब सर्वर गेटवे इंटरफ़ेस
- रैक (वेब सर्वर इंटरफ़ेस)
- सर्वर साइड शामिल है
- वेब सर्वर गेटवे इंटरफ़ेस
संदर्भ
- ↑ Robinson <drtr@apache.org>, David. "कॉमन गेटवे इंटरफ़ेस (CGI) संस्करण 1.1". tools.ietf.org (in English). Retrieved 16 February 2021.
- ↑ Robinson <drtr@apache.org>, David. "कॉमन गेटवे इंटरफ़ेस (CGI) संस्करण 1.1". tools.ietf.org (in English). Archived from the original on 11 February 2007. Retrieved 16 February 2021.
- ↑ 3.0 3.1 3.2 "RFC3875: The Common Gateway Interface (CGI) Version 1.1".
- ↑ McCool, Rob (November 14, 1993). "सर्वर लिपियों". www-talk (Mailing list). Retrieved 2019-05-15.
- ↑ "कॉमन गेटवे इंटरफ़ेस". hoohoo.ncsa.uiuc.edu. National Center for Supercomputing Applications (NCSA). Archived from the original on 27 January 2010.
- ↑ "CGI: Common Gateway Interface". w3.org. World Wide Web Consortium. Retrieved 2019-05-15.
- ↑ "कॉमन गेटवे इंटरफ़ेस RFC प्रोजेक्ट पेज". Archived from the original on 25 August 2013.
- ↑ "Mapping URLs to Filesystem Locations Apache HTTP Server Version 2.2".
- ↑ Nelson, Anne Fulcher, and Nelson, William Harris Morehead. (2001). Building Electronic Commerce with Web Database Constructions. Boston, MA: Addison Wesley.
- ↑ "CGI Primer (Mirror at citycat.ru)".
- ↑ "Abacles HTML प्रपत्र". www.abacles.com. Archived from the original on 19 April 2016. Retrieved 6 April 2016.
- ↑ "phf CGI स्क्रिप्ट न्यूलाइन वर्णों से बचाव करने में विफल रहती है". Software Engineering Institute CERT Coordination Center. Retrieved 21 November 2019.
- ↑ Enrico Marino (11 September 2018). वितरित वेब में सूचना प्रबंधन (PDF) (phd). Roma Tre University. Archived (PDF) from the original on 12 February 2019. Retrieved 11 February 2019.
बाहरी संबंध
- GNU cgicc, a C++ class library for writing CGI applications
- CGI, a standard Perl module for CGI request parsing and HTML response generation
- CGI Programming 101: Learn CGI Today!, a CGI tutorial
- The Invention of CGI