بيرل CGI البرمجة
ما هو CGI
CGI يحتفظ بها حاليا التقييم الذاتي، يتم تعريف التقييم الذاتي CGI على النحو التالي:
CGI (واجهة العبارة الشائعة)، واجهة العبارة الشائعة، وهو برنامج يعمل على الخادم، مثل: ملقم HTTP، واجهة العميل توفير نفس صفحة HTML.
تصفح الإنترنت
لفهم أفضل لكيفية يعمل CGI، يمكننا أن تنقر على وصلة على صفحة ويب أو URL من هذه العملية:
- 1، استخدام المتصفح للوصول إلى URL والاتصال إلى ملقم HTTP على شبكة الإنترنت.
- 2، يتلقى ملقم ويب سيتم تحليل رسالة طلب URL وتبدو الوصول إلى الملفات على الخادم إذا كان هناك، إذا كان هناك للعودة محتويات الملف، وإلا فإنها ترجع رسالة خطأ.
- 3، يتلقى متصفح المعلومات من الخادم ويعرض الملف أو خطأ الرسائل الواردة.
ويمكن لبرامج CGI يكون السيناريو بيثون، المخطوطة، شيل، C أو C ++ البرامج.
CGI الرسم البياني
تكوين خادم الويب والدعم
قبل إجراء البرمجة CGI، تأكد من أنه قد تم تكوين ملقم ويب لدعم CGI ومعالج CGI.
أباتشي يدعم التكوين CGI:
إعداد دليل CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
يتم تخزين كل ملقم HTTP لتنفيذ برامج CGI في دليل تكوين مسبقا. ويسمى هذا الدليل الدليل CGI، والمؤتمرات، وأطلق عليها اسم / فار / على شبكة الاتصالات العالمية / الدليل-CGI بن.
ملف CGI تمديد .cgi، بيرل يمكن أيضا استخدام ملحق .PL.
افتراضيا، تكوين الملقم تشغيل لينكس دليل CGI بن هو / فار / على شبكة الاتصالات العالمية.
إذا كنت ترغب في تحديد دليل آخر لتشغيل البرامج النصية CGI، يمكنك تعديل ملف تكوين ملف httpd.conf على النحو التالي:
<Directory "/var/www/cgi-bin"> AllowOverride None Options +ExecCGI Order allow,deny Allow from all </Directory>
إضافة لاحقة .PL AddHandler، حتى نتمكن من الوصول إلى نهاية الملف النصي بيرل .PL:
AddHandler cgi-script .cgi .pl .py
برنامج CGI الأول
أدناه ونحن إنشاء ملف test.cgi، رمز على النحو التالي:
#!/usr/bin/perl print "Content-type:text/html\r\n\r\n"; print '<html>'; print '<head>'; print '<meta charset="utf-8">'; print '<title>本教程(w3big.com)</title>'; print '</head>'; print '<body>'; print '<h2>Hello Word! </h2>'; print '<p>来自本教程第一个 CGI 程序。</p>'; print '</body>'; print '</html>'; 1;
ثم فتح المتصفح الخاص بك إلى http: //localhost/cgi-bin/test.cgi، نتائج الإخراج هي كما يلي:
إخراج السطر الأول من النص "نوع المحتوى: نص / HTML \ ص \ ن \ ص \ ن" يتم إرسالها إلى المتصفح وتخبر المتصفح لعرض نوع المحتوى "نص / أتش تي أم أل".
رأس HTTP
محتويات الملف test.cgi في: جزء من رأس HTTP هي "نوع المحتوى النص / أتش تي أم أل"، وسوف يتم إرسالها إلى نوع محتوى المتصفح يحكي ملفات المتصفح.
شكل رأس HTTP هو على النحو التالي:
HTTP 字段名: 字段内容
على سبيل المثال:
Content-type:text/html\r\n\r\n
يصف الجدول التالي وغالبا ما تستخدم هذه المعلومات في برامج CGI رأس HTTP:
رئيس | وصف |
---|---|
المحتوى من نوع: | كيان MIME المقابلة لطلب المعلومات. على سبيل المثال: نوع المحتوى: نص / HTML |
ينتهي: التاريخ | تاريخ استجابة والوقت انتهى |
الموقع: URL | لإعادة توجيه المتلقي لطلب URL غير موقع لإتمام الطلب أو تحديد موارد جديدة |
آخر تعديل: التاريخ | المورد المطلوب آخر تعديل |
المحتوى طول: N | طلب محتوى طول |
تعيين ملف تعريف الارتباط: سلسلة | إعدادات المتشعب كوكي |
متغيرات البيئة CGI
وقد تلقى جميع برامج CGI متغيرات البيئة التالية، التي لعبت دورا مهما في برنامج CGI:
اسم المتغير | وصف |
---|---|
CONTENT_TYPE | تشير هذه القيمة إلى متغير البيئة لنوع MIME نقل المعلومات. في الوقت الحاضر، ومتغيرات البيئة بشكل عام CONTENT_TYPE: وقال urlencoded س-وو-شكل التطبيق / أن البيانات من النموذج HTML. |
CONTENT_LENGTH | إذا كانت المعلومات الخادم واسطة نقل وبرنامج CGI هي وظيفة، حتى لو كانت بيئة متغيرة STDIN إدخال عدد البايتات التي يمكن قراءة بيانات صالحة من هذا المعيار. هذا متغير البيئة عند قراءة البيانات المدخلة يجب استخدامها. |
HTTP_COOKIE | المحتوى كوكي ضمن العميل. |
HTTP_USER_AGENT | توفير المعلومات يتضمن رقم الإصدار من متصفح العميل أو بيانات الملكية الأخرى. |
PATH_INFO | قيمة متغير البيئة هذا يشير إلى اسم البرنامج CGI مباشرة بعد معلومات المسار إضافية. في كثير من الأحيان يبدو كبرنامج حجة CGI. |
QUERY_STRING | إذا كانت المعلومات الخادم واسطة نقل وبرنامج CGI هي المعلومات GET، وقيمة هذا المتغير البيئة حتى لو مرت. ويتبع هذه المعلومات من قبل اسم البرنامج CGI، سواء في الوسط مع علامة استفهام "؟" فاصل. |
REMOTE_ADDR | قيمة متغير البيئة هذا هو عنوان IP للعميل يرسل الطلب، على سبيل المثال، 192.168.1.67 أعلاه. هذه القيمة هي دائما موجودة. وهو الحاجة إلى توفير عميل ويب لمعرف فريد ملقم ويب يمكن استخدامها في برامج CGI للتمييز بين عميل ويب مختلفة. |
REMOTE_HOST | تحتوي على قيمة هذا المتغير بيئة اسم المضيف للعميل طلب من المجموعة الاستشارية لاندونيسيا. إذا كان لا تريد التحقق، لا تحتاج إلى تعريف هذا المتغير البيئة. |
REQUEST_METHOD | أنه يوفر طريقة تسمى النصي. لHTTP النصي / بروتوكول 1.0 فقط الحصول على وظيفة ذات مغزى. |
SCRIPT_FILENAME | المسار الكامل لنصوص CGI |
البرمجي | اسم البرنامج النصي CGI |
SERVER_NAME | هذا هو اسم المضيف، اسم مستعار، أو عنوان IP لخادم الويب الخاص بك. |
SERVER_SOFTWARE | تحتوي على قيمة متغير البيئة هذا اسم البرنامج دعوة CGI ورقم الإصدار خادم HTTP. على سبيل المثال، فإن القيمة أعلاه من طراز أباتشي / 2.2.14 (يونكس) |
هنا هو بسيط متغيرات البيئة الناتج CGI النصي CGI:
#!/usr/bin/perl print "Content-type: text/html\n\n"; print '<meta charset="utf-8">'; print "<font size=+1>环境变量:</font>\n"; foreach (sort keys %ENV) { print "<b>$_</b>: $ENV{$_}<br>\n"; } 1;
التنزيلات
إذا أردنا أن نحقق من خلال بيرل تحميل الملفات CGI، تتطلب مجموعة مختلفة من معلومات رأس على النحو التالي:
#!/usr/bin/perl # HTTP Header print "Content-Type:application/octet-stream; name=\"FileName\"\r\n"; print "Content-Disposition: attachment; filename=\"FileName\"\r\n\n"; # Actual File Content will go hear. open( FILE, "<FileName" ); while(read(FILE, $buffer, 100) ) { print("$buffer"); }
استخدام الأسلوب GET لنقل البيانات
الحصول على طريقة لإرسال معلومات المستخدم المشفرة إلى خادم، يرد المعلومات والبيانات في URL طلب الصفحة إلى عدد مقسمة على النحو التالي "؟":
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2طلبات GET حول بعض التعليقات الأخرى:
- طلب GET يمكن أن يكون مؤقتا
- يبقى طلب GET في تاريخ المتصفح
- GET طلبات يمكن وضع إشارة
- GET طلبات لا ينبغي أن تستخدم عند التعامل مع بيانات حساسة
- طلبات GET لها قيود طول
- GET ينبغي أن تستخدم طلبات فقط لاسترداد البيانات
أمثلة على رابط بسيط: GET طريقة
ما يلي هو عنوان بسيط، وذلك باستخدام طريقة GET لإرسال اثنين من المعلمات لبرنامج test.cgi:
/cgi-bin/test.cgi?name=本教程&url=http://www.w3big.com
ملف كود test.cgi:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取文本信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "GET") { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $name = $FORM{name}; $url = $FORM{url}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3big.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
تحقق المتصفح الخاص بك، نتائج الإخراج هي كما يلي:
ومن الأمثلة على نموذج بسيط: GET طريقة
وفيما يلي اثنين من إرسال البيانات إلى الخادم باستخدام طريقة GET عبر نموذج HTML، قدمت الوثيقة نفسها test.cgi النصي الملقم، test.html متاحة على النحو التالي:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="get"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
تنفيذ متصفح النتائج على النحو التالي:
استخدام الأسلوب POST لتمرير البيانات
استخدام الأسلوب POST لتمرير البيانات إلى الخادم هو أكثر أمنا وموثوق بها، وبعض المعلومات الحساسة مثل كلمات السر حاجة المستخدم لاستخدام وظيفة لنقل البيانات.
وفيما يلي test.cgi أيضا، فإنه يمكن أيضا التعامل مع بيانات النموذج الوظائف المقدمة من قبل المتصفح:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取文本信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $name = $FORM{name}; $url = $FORM{url}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3big.com)</title>'; print "</head>"; print "<body>"; print "<h2>$name网址:$url</h2>"; print "</body>"; print "</html>"; 1;
وفيما يلي اثنين من إرسال البيانات إلى الخادم باستخدام طريقة GET عبر نموذج HTML، قدمت الوثيقة نفسها test.cgi النصي الملقم، test.html متاحة على النحو التالي:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post"> 站点名称: <input type="text" name="name"> <br /> 站点 URL: <input type="text" name="url" /> <input type="submit" value="提交" /> </form> </body> </html>
تنفيذ متصفح النتائج على النحو التالي:
برنامج CGI لتمرير البيانات من خلال مربع
مربع تستخدم لتقديم واحد أو أكثر من البيانات الخيار، test.html متاحة على النحو التالي:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="POST" target="_blank"> <input type="checkbox" name="w3big" value="on" /> 本教程 <input type="checkbox" name="google" value="on" /> Google <input type="submit" value="选择站点" /> </form> </body> </html>
ملف كود test.cgi:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value; } if( $FORM{w3big} ){ $w3big_flag ="ON"; }else{ $w3big_flag ="OFF"; } if( $FORM{google} ){ $google_flag ="ON"; }else{ $google_flag ="OFF"; } print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3big.com)</title>'; print "</head>"; print "<body>"; print "<h2> 本教程选中状态 : $w3big_flag</h2>"; print "<h2> Google 选择状态 : $google_flag</h2>"; print "</body>"; print "</html>"; 1;
تنفيذ متصفح النتائج على النحو التالي:
الراديو لنقل البيانات عن طريق برنامج CGI
راديو فقط نقل البيانات إلى ملقم، test.html متاحة على النحو التالي:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <input type="radio" name="site" value="w3big" /> 本教程 <input type="radio" name="site" value="google" /> Google <input type="submit" value="提交" /> </form> </body> </html>
رمز البرنامج النصي test.cgi على النحو التالي:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $site = $FORM{site}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3big.com)</title>'; print "</head>"; print "<body>"; print "<h2> 选择的网站 $site</h2>"; print "</body>"; print "</html>"; 1;
تنفيذ متصفح النتائج على النحو التالي:
نقل البيانات ناحية النص عبر برنامج CGI
تمريرة ناحية النص صفوف متعددة من البيانات إلى الخادم، test.html متاحة على النحو التالي:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <textarea name="textcontent" cols="40" rows="4"> 在这里输入内容... </textarea> <input type="submit" value="提交" /> </form> </body> </html>
رمز البرنامج النصي test.cgi على النحو التالي:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $text_content = $FORM{textcontent}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3big.com)</title>'; print "</head>"; print "<body>"; print "<h2>输入的文本内容为:$text_content</h2>"; print "</body>"; print "</html>"; 1;
تنفيذ متصفح النتائج على النحو التالي:
برنامج CGI لتمرير البيانات من خلال المنسدلة
HTML كود المربع المنسدل على النحو التالي:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>本教程(w3big.com)</title> </head> <body> <form action="/cgi-bin/test.cgi" method="post" target="_blank"> <select name="dropdown"> <option value="w3big" selected>本教程</option> <option value="google">Google</option> </select> <input type="submit" value="提交"/> </form> </body> </html>
رمز البرنامج النصي test.cgi على النحو التالي:
#!/usr/bin/perl local ($buffer, @pairs, $pair, $name, $value, %FORM); # 读取信息 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/; if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else { $buffer = $ENV{'QUERY_STRING'}; } # 读取 name/value 对信息 @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%(..)/pack("C", hex($1))/eg; $FORM{$name} = $value; } $site = $FORM{dropdown}; print "Content-type:text/html\r\n\r\n"; print "<html>"; print "<head>"; print '<meta charset="utf-8">'; print '<title>本教程(w3big.com)</title>'; print "</head>"; print "<body>"; print "<h2>选择的网站是:$site</h2>"; print "</body>"; print "</html>"; 1;
تنفيذ متصفح النتائج على النحو التالي:
يستخدم CGI كوكي
بروتوكول HTTP في العيب الكبير هو الخطأ الحكم على هوية المستخدم، والتي تعطي المبرمجين قدرا كبيرا من الإزعاج، ولكن يبدو ظيفة ملفات تعريف الارتباط يعوض عن هذا النقص.
كعك أن يتم الوصول إلى النصي في حين أن العملاء من خلال متصفح العميل على القرص الثابت العميل لكتابة سجلات البيانات واسترجاع البيانات عندما يزور العميل النصي المقبل، وذلك لتحقيق وظيفة تحديد الهوية، الكعكة التي يشيع استخدامها في التحقق من الهوية.
تركيب كوكي
يتم إرسال الكوكيز المتشعب من خلال رأس HTTP لتحقيق، كان عليه أن نقل الملفات، جملة رأس تعيين ملف تعريف الارتباط على النحو التالي:
Set-cookie:name=name;expires=date;path=path;domain=domain;secure
- اسم = اسم: لضبط قيمة ملف تعريف الارتباط (لا يمكن أن تستخدم اسم ""؛ و "،" رقم)، عندما تكون هناك قيم اسم متعددة "،" للفصل، على سبيل المثال: NAME1 = NAME1. NAME2 = NAME2 . NAME3 = NAME3.
- تنتهي = التاريخ: كوكي تاريخ انتهاء الصلاحية في الشكل: تنتهي = "Wdy، DD- الاثنين-YYYY HH: MM: SS"
- مسار = مسار: لتعيين مسار دعم الكوكي، إذا كان المسار هو مسار، ملفات تعريف الارتباط لكافة الملفات والدلائل من إدخال دليل حيز التنفيذ، على سبيل المثال: مسار = "/-CGI بن /"، إذا كان المسار ملف، كوكي ويشير إلى بدء نفاذ هذا الملف، على سبيل المثال: مسار = "/-CGI بن / cookie.cgi".
- المجال = المجال: اسم المجال من الكعكة صالح، على سبيل المثال: مجال = "www.w3big.com"
- تأمين: إذا تم إعطاء هذا العلم، أن الكعكة يمكن أن ينتقل إلا عن طريق الخادم بروتوكول https SSL.
- استلام الكعكة من خلال إعداد متغيرات البيئة HTTP_COOKIE تحقيقه، برامج CGI يمكن الحصول على المعلومات عن طريق استرداد متغير الكعكة.
إعدادات ملفات تعريف الارتباط
هو بسيط جدا، سيتم إرسال إعدادات ملفات تعريف الارتباط الكوكيز بشكل منفصل في رأس HTTP. يقوم المثال التالي من هوية المستخدم، كلمة المرور وتنتهي في الكعكة:
#!/usr/bin/perl print "Set-Cookie:UserID=XYZ;\n"; print "Set-Cookie:Password=XYZ123;\n"; print "Set-Cookie:Expires=Tuesday, 31-Dec-2017 23:12:40 GMT";\n"; print "Set-Cookie:Domain=www.w3big.com;\n"; print "Set-Cookie:Path=/perl;\n"; print "Content-type:text/html\r\n\r\n"; ...........其他 HTML 内容
البحث كوكي
كوكي الصفحة استرجاع المعلومات بسيطة جدا، في CGI متغيرات البيئة HTTP_COOKIE، تنسيق تخزين كما يلي يتم تخزين المعلومات كوكي:
#!/usr/bin/perl $rcvd_cookies = $ENV{'HTTP_COOKIE'}; @cookies = split /;/, $rcvd_cookies; foreach $cookie ( @cookies ){ ($key, $val) = split(/=/, $cookie); # splits on the first =. $key =~ s/^\s+//; $val =~ s/^\s+//; $key =~ s/\s+$//; $val =~ s/\s+$//; if( $key eq "UserID" ){ $user_id = $val; }elsif($key eq "Password"){ $password = $val; } } print "User ID = $user_id\n"; print "Password = $password\n";
إخراج المثال أعلاه هو:
User ID = XYZ Password = XYZ123
وحدة CGI
بيرل CGI يوفر العديد من وحدة مدمجة، وتستخدم التاليين: