واجهة البوابة المشتركة

الشعار الرسمي بتقنية CGI من إعلان المواصفات

في مجال الحوسبة ، تعتبر واجهة البوابة المشتركة ( CGI ) مواصفات واجهة تمكن خوادم الويب من تنفيذ برنامج خارجي لمعالجة طلبات المستخدم HTTP أو HTTPS .

غالباً ما تُكتب هذه البرامج بلغة برمجة نصية وتُعرف عادةً باسم نصوص CGI ، ولكنها قد تتضمن برامج مُجمّعة . [ 1 ]

يحدث مثال نموذجي عندما يُرسل مستخدم الويب نموذجًا على صفحة ويب تستخدم تقنية CGI. تُرسل بيانات النموذج إلى خادم الويب ضمن طلب HTTP مع عنوان URL يُشير إلى نص برمجي CGI. ثم يُشغّل خادم الويب النص البرمجي CGI في عملية حاسوبية جديدة ، مُمررًا إليه بيانات النموذج. يُمرر النص البرمجي CGI مُخرجاته، عادةً بصيغة HTML ، إلى خادم الويب، الذي يُعيد توجيهها إلى المتصفح كاستجابة لطلب المتصفح. [ 2 ]

طُوّرت تقنية CGI في أوائل التسعينيات، وكانت أول طريقة شائعة متاحة تسمح بتفاعل صفحات الويب. ونظرًا لضرورة تشغيل نصوص CGI في عملية منفصلة في كل مرة يرد فيها طلب من العميل، طُوّرت بدائل مختلفة.

تاريخ

في عام ١٩٩٣، قام فريق المركز الوطني لتطبيقات الحوسبة الفائقة (NCSA) بكتابة مواصفات استدعاء الملفات التنفيذية من سطر الأوامر على القائمة البريدية www-talk. [ ٣ ] [ ٤ ] [ ٥ ] وقد اعتمدها مطورو خوادم الويب الآخرون، وأصبحت منذ ذلك الحين معيارًا لخوادم الويب. وفي نوفمبر ١٩٩٧، بدأ فريق عمل برئاسة كين كوار العمل على وضع تعريف أكثر دقة لـ CGI وفقًا لتعريف NCSA. [ ٦ ] وقد أسفر هذا العمل عن RFC ٣٨٧٥ ، الذي حدد CGI الإصدار ١.١. وقد ذُكر في RFC على وجه التحديد المساهمون التاليون: [ ٢ ] 

تاريخياً، كانت برامج CGI تُكتب غالباً باستخدام لغة البرمجة C. ويُعرّف RFC 3875 "واجهة البوابة المشتركة (CGI)" جزئياً CGI باستخدام C، [ 2 ] حيث ينص على أنه "يتم الوصول إلى متغيرات البيئة بواسطة روتين مكتبة C المسمى getenv() أو المتغير environ".

يعود اسم CGI إلى بدايات الإنترنت، حيث سعى مشرفو المواقع إلى ربط أنظمة المعلومات القديمة، مثل قواعد البيانات، بخوادم الويب الخاصة بهم. كان برنامج CGI يُنفذ بواسطة الخادم، موفراً "بوابة" مشتركة بين خادم الويب ونظام المعلومات القديم.

غاية

تقليديًا، يحتوي خادم الويب على دليل يُسمى مجموعة المستندات، أي مجموعة من الملفات التي يمكن إرسالها إلى متصفحات الويب المتصلة بالخادم. [ 7 ] على سبيل المثال، إذا كان لخادم الويب اسم نطاق مؤهل بالكاملwww.example.com ، وكانت مجموعة مستنداته مخزنة في نظام الملفات/usr/local/apache/htdocs/ المحلي ( جذر المستندات )، فسيستجيب خادم الويب لطلب ملف معين بإرسال نسخة من الملف (إن وُجد) إلى المتصفح .http://www.example.com/index.html/usr/local/apache/htdocs/index.html

بالنسبة للصفحات التي يتم إنشاؤها أثناء التشغيل، قد يقوم برنامج الخادم بتأجيل الطلبات إلى برامج منفصلة وإعادة توجيه النتائج إلى العميل الطالب (عادةً ما يكون متصفح ويب يعرض الصفحة للمستخدم النهائي).

تتطلب هذه البرامج عادةً تحديد بعض المعلومات الإضافية مع الطلب، مثل سلاسل الاستعلام أو ملفات تعريف الارتباط . في المقابل، عند الاستجابة، يجب أن يوفر البرنامج النصي جميع المعلومات التي يتطلبها بروتوكول HTTP للرد على الطلب: حالة HTTP للطلب، ومحتوى المستند (إن وجد)، ونوع المستند (مثل HTML أو PDF أو نص عادي)، وما إلى ذلك.

في البداية، لم تكن هناك طرق موحدة لتبادل البيانات بين المتصفح وخادم HTTP الذي يتواصل معه، والبرامج النصية الموجودة على الخادم والتي كان من المفترض أن تعالج البيانات وتعيد النتيجة في النهاية إلى المتصفح. ونتيجة لذلك، وُجدت اختلافات بين إصدارات خادم HTTP المختلفة، مما أضعف قابلية نقل البرامج النصية .

أدى إدراك هذه المشكلة إلى تحديد كيفية إجراء تبادل البيانات، مما أسفر عن تطوير CGI. تُعرف البرامج التي تولد صفحات الويب والتي يتم استدعاؤها بواسطة برامج الخادم التي تلتزم بمواصفات CGI باسم نصوص CGI ، على الرغم من أنها قد تكون مكتوبة في الواقع بلغة غير نصية ، مثل C.

تم اعتماد مواصفات CGI بسرعة ولا تزال مدعومة من قبل العديد من حزم خوادم HTTP المعروفة، مثل Apache و Microsoft IIS و (مع امتداد) الخوادم القائمة على Node.js.

كان أحد الاستخدامات المبكرة لبرامج CGI النصية هو معالجة النماذج. في بدايات لغة HTML، كانت نماذج HTML تحتوي عادةً على سمة "action" وزر يُسمى زر "إرسال". عند الضغط على زر الإرسال، يتم إرسال عنوان URI المحدد في سمة "action" إلى الخادم مع بيانات النموذج المرسلة كسلسلة استعلام. إذا حددت سمة "action" برنامج CGI نصيًا، فسيتم تنفيذ هذا البرنامج النصي، والذي بدوره يُنشئ صفحة HTML.

الانتشار

يمكن تهيئة خادم ويب يدعم CGI لتفسير عنوان URL الذي يُشير إلى نص برمجي CGI. من المتعارف عليه وجود دليل cgi-bin/في قاعدة شجرة الدليل، والتعامل مع جميع الملفات التنفيذية داخل هذا الدليل (دون غيره لأسباب أمنية) كنصوص برمجية CGI. عندما يطلب متصفح ويب عنوان URL يُشير إلى ملف داخل دليل CGI ( مثلاً ، ` cgi . ...http://example.com/cgi-bin/printenv.pl/with/additional/path?and=a&query=string/usr/local/apache/htdocs/cgi-bin/printenv.pl.cgi

تحدد مواصفات CGI كيفية تمرير المعلومات الإضافية المُرفقة بالطلب إلى البرنامج النصي. يقوم خادم الويب بإنشاء مجموعة فرعية من متغيرات البيئة المُمررة إليه، ويضيف إليها تفاصيل خاصة ببيئة HTTP. على سبيل المثال، إذا أُضيفت شرطة مائلة واسم (أسماء) دليل إضافي إلى عنوان URL مباشرةً بعد اسم البرنامج النصي (في هذا المثال، /with/additional/path)، فسيتم تخزين هذا المسار في PATH_INFOمتغير البيئة قبل استدعاء البرنامج النصي. إذا أُرسلت معلمات إلى البرنامج النصي عبر طلب HTTP GET (علامة استفهام مُضافة إلى عنوان URL، متبوعة بأزواج param=value؛ في المثال، ?and=a&query=string)، فسيتم تخزين هذه المعلمات في QUERY_STRINGمتغير البيئة قبل استدعاء البرنامج النصي. يتم تمرير نص رسالة طلب HTTP ، مثل معلمات النموذج المُرسلة عبر طلب HTTP POST ، إلى المدخلات القياسية للبرنامج النصي . يمكن للبرنامج النصي بعد ذلك قراءة متغيرات البيئة هذه أو البيانات من المدخلات القياسية والتكيف مع طلب متصفح الويب. [ 8 ]

الاستخدامات

تُستخدم تقنية CGI غالبًا لمعالجة مدخلات المستخدم وإنتاج المخرجات المناسبة. ومن أمثلة برامج CGI برنامج يُنفذ ويكي . إذا طلب المستخدم اسم مدخل، يقوم خادم الويب بتشغيل برنامج CGI. يسترجع برنامج CGI مصدر صفحة ذلك المدخل (إن وُجد)، ويُحوله إلى HTML ، ثم يعرض النتيجة. يستقبل خادم الويب مخرجات برنامج CGI ويرسلها إلى المستخدم. بعد ذلك، إذا نقر المستخدم على زر "تعديل الصفحة"، يقوم برنامج CGI بتعبئة textareaعنصر تحكم التحرير، سواءً كان HTML أو غيره، بمحتوى الصفحة. وأخيرًا، إذا نقر المستخدم على زر "نشر الصفحة"، يُحول برنامج CGI كود HTML المُحدث إلى مصدر صفحة ذلك المدخل ويحفظه.

حماية

تعمل برامج CGI، افتراضيًا، ضمن سياق أمان خادم الويب. عند إطلاقها لأول مرة، تم توفير عدد من البرامج النصية النموذجية مع التوزيعات المرجعية لخوادم الويب التابعة لـ NCSA وApache وCERN لتوضيح كيفية برمجة البرامج النصية أو برامج C للاستفادة من CGI الجديدة. أحد هذه البرامج النصية النموذجية كان برنامج CGI يُسمى PHF، والذي يُنفذ دليل هاتف بسيط.

على غرار العديد من البرامج النصية الأخرى في ذلك الوقت، استخدم هذا البرنامج النصي دالةً ما escape_shell_cmd(). كان من المفترض أن تقوم هذه الدالة بتنظيف وسيطها، المُستَقبَل من المستخدم، ثم تمريره إلى واجهة سطر الأوامر (Shell) في نظام يونكس، ليتم تشغيله ضمن سياق أمان خادم الويب. إلا أن البرنامج النصي لم يُنظِّف جميع المدخلات بشكل صحيح، وسمح بتمرير أسطر جديدة إلى واجهة سطر الأوامر، مما أتاح فعليًا تنفيذ أوامر متعددة. ثم عُرضت نتائج هذه الأوامر على خادم الويب. وإذا سمح سياق أمان خادم الويب بذلك، فقد يتمكن المهاجمون من تنفيذ أوامر خبيثة.

كان هذا أول مثال واسع الانتشار لنوع جديد من الهجمات الإلكترونية يُسمى حقن التعليمات البرمجية ، حيث يمكن أن تؤدي البيانات غير المُعالجة من مستخدمي الإنترنت إلى تنفيذ تعليمات برمجية على خادم الويب. ولأن التعليمات البرمجية النموذجية كانت مُثبتة افتراضيًا، فقد انتشرت الهجمات على نطاق واسع وأدت إلى إصدار عدد من التحذيرات الأمنية في أوائل عام 1996. [ 9 ]

تسمح ثغرة "Shellshock" في Bash بتنفيذ البيانات المحقونة في متغيرات البيئة ، وهي تحديدًا الآلية التي يستخدمها CGI لجعل رؤوس HTTP متاحة للبرامج؛ وبالتالي، قد تكون نصوص Bash المستخدمة كبرامج CGI قد تعرضت لثغرة أمنية تسمح بتنفيذ التعليمات البرمجية عن بُعد . [ 10 ]

البدائل

لكل طلب HTTP وارد، يُنشئ خادم الويب عملية CGI جديدة لمعالجته، ثم يُنهي هذه العملية بعد معالجة الطلب. قد يستهلك إنشاء العملية وإنهاؤها وقتًا وذاكرةً أكثر من العمل الفعلي لإنتاج مخرجاتها، خاصةً عندما يحتاج برنامج CGI إلى تفسير بواسطة آلة افتراضية. في حال وجود عدد كبير من طلبات HTTP، قد يُرهق عبء العمل الناتج خادم الويب بسرعة.

يمكن تقليل العبء الحسابي المتضمن في إنشاء عمليات CGI وتدميرها باستخدام التقنيات التالية:

  • برامج CGI التي تم تجميعها مسبقًا إلى لغة الآلة ، على سبيل المثال تم تجميعها مسبقًا من برامج C أو C++ ، بدلاً من برامج CGI التي يتم تنفيذها بواسطة مترجم، على سبيل المثال برامج Perl أو PHP أو Python .
  • ملحقات خادم الويب مثل وحدات Apache (على سبيل المثال mod_perl، mod_phpو mod_python)، ومكونات NSAPI الإضافية، ومكونات ISAPI الإضافية التي تسمح لعمليات التطبيق طويلة الأمد بمعالجة أكثر من طلب واحد واستضافتها داخل خادم الويب.
  • FastCGI, SCGI, and AJP which allow long-running application processes handling more than one request to be hosted externally; i.e., separately from the Web server. Each application process listens on a socket; the Web server handles an HTTP request and sends it via another protocol (FastCGI, SCGI or AJP) to the socket only for dynamic content, while static content is usually handled directly by the Web server. This approach needs fewer application processes so consumes less memory than the Web server extension approach. And unlike converting an application program to a Web server extension, FastCGI, SCGI, and AJP application programs remain independent of the Web server.
  • Jakarta EE runs Jakarta Servlet applications in a Web container to serve dynamic content and optionally static content which replaces the overhead of creating and destroying processes with the much lower overhead of creating and destroying threads. It also exposes the programmer to the library that comes with Java SE on which the version of Jakarta EE in use is based.
  • Standalone HTTP Server
  • Web Server Gateway Interface (WSGI) is a modern approach written in the Python programming language. It is defined by PEP 3333[11] and implemented via various methods like mod_wsgi (Apache module), Gunicorn web server (in between of Nginx & Scripts/Frameworks like Django), UWSGI, etc.

The optimal configuration for any Web application depends on application-specific details, amount of traffic, and complexity of the transaction; these trade-offs need to be analyzed to determine the best implementation for a given task and time budget. Web frameworks offer an alternative to using CGI scripts to interact with user agents.

See also

References

  1. D. Robinson; K. Coar (October 2004). The Common Gateway Interface (CGI) Version 1.1. IETF. doi:10.17487/RFC3875. RFC3875.معلوماتي. القسم 1.4.
  2. 1 2 3 د. روبنسون؛ ك. كوار (أكتوبر 2004). واجهة البوابة المشتركة (CGI) الإصدار 1.1 . IETF . doi : 10.17487/RFC3875 . RFC 3875 .لأغراض إعلامية.
  3. ماكول، روب (14 نوفمبر 1993). "برامج الخادم النصية" . www-talk (قائمة بريدية) . تم الاسترجاع في 15 مايو 2019 .
  4. "واجهة البوابة المشتركة" . hoohoo.ncsa.uiuc.edu . المركز الوطني لتطبيقات الحوسبة الفائقة (NCSA). مؤرشف من الأصل في 27 يناير 2010.
  5. "CGI: واجهة البوابة المشتركة" . w3.org . اتحاد شبكة الويب العالمية. مؤرشف من الأصل في 19 ديسمبر 2009. تم الاطلاع عليه في 15 مايو 2019 .
  6. "صفحة مشروع واجهة البوابة المشتركة RFC" . مؤرشفة من الأصل في 25 أغسطس 2013.
  7. "ربط عناوين URL بمواقع نظام الملفات في خادم Apache HTTP الإصدار 2.2" . مؤرشف من الأصل بتاريخ 15 يوليو 2014. تم الاطلاع عليه بتاريخ 16 يوليو 2014 .
  8. نيلسون، آن فولشر؛ نيلسون، ويليام هاريس مورهد (2001). بناء التجارة الإلكترونية باستخدام هياكل قواعد بيانات الويب . بوسطن، ماساتشوستس: أديسون ويسلي.
  9. "فشل برنامج phf CGI النصي في الحماية من أحرف السطر الجديد" . معهد هندسة البرمجيات، مركز تنسيق CERT . مؤرشف من الأصل في 28 يوليو 2020. تم الاطلاع عليه في 21 نوفمبر 2019 .
  10. ليدن، جون (24 سبتمبر 2014). "تحديث باش الآن: ثغرة 'شل شوك' تُعرّض أنظمة ماك أو إس إكس ولينكس لخطر جسيم" . ذا ريجستر . تم الاطلاع عليه بتاريخ 25 سبتمبر 2014 .
  11. "PEP 3333 – واجهة بوابة خادم الويب بايثون الإصدار 1.0.1 | peps.python.org" . مقترحات تحسين بايثون (PEPs) . تم الاطلاع عليه بتاريخ 5 أبريل 2024 .