ซีจีไอคืออะไร
ปัจจุบัน CGI ได้รับการดูแลโดย NCSA ซึ่งกำหนด CGI ดังนี้
CGI (Common Gateway Interface) Common Gateway Interface เป็นโปรแกรมที่ทำงานบนเซิร์ฟเวอร์ เช่น เซิร์ฟเวอร์ HTTP และจัดให้มีอินเทอร์เฟซกับเพจ HTML ของไคลเอ็นต์
การท่องเว็บ
เพื่อให้เข้าใจวิธีการทำงานของ CGI ได้ดีขึ้น เราสามารถเริ่มต้นด้วยขั้นตอนการคลิกลิงก์หรือ URL บนหน้าเว็บ:
1. ใช้เบราว์เซอร์ของคุณเพื่อเข้าถึง URL และเชื่อมต่อกับเว็บเซิร์ฟเวอร์ HTTP
2. หลังจากได้รับข้อมูลคำขอแล้ว เว็บเซิร์ฟเวอร์จะแยกวิเคราะห์ URL และตรวจสอบว่ามีไฟล์ที่เข้าถึงอยู่บนเซิร์ฟเวอร์หรือไม่ หากมีไฟล์อยู่ ก็จะส่งคืนเนื้อหาของไฟล์ มิฉะนั้นจะส่งคืนข้อความแสดงข้อผิดพลาด
3. เบราว์เซอร์รับข้อมูลจากเซิร์ฟเวอร์และแสดงไฟล์ที่ได้รับหรือข้อความแสดงข้อผิดพลาด
โปรแกรม CGI อาจเป็นสคริปต์ Python, สคริปต์ PERL, สคริปต์ SHELL, โปรแกรม C หรือ C++ เป็นต้น
แผนภาพสถาปัตยกรรม CGI
การสนับสนุนและการกำหนดค่าเว็บเซิร์ฟเวอร์
ก่อนที่คุณจะดำเนินการเขียนโปรแกรม CGI ตรวจสอบให้แน่ใจว่าเว็บเซิร์ฟเวอร์ของคุณรองรับ CGI และได้กำหนดค่าตัวจัดการ CGI แล้ว
Apache รองรับการกำหนดค่า CGI:
ตั้งค่าไดเร็กทอรี CGI:
ScriptAlias /cgi-bin/ /var/www/cgi-bin/
โปรแกรม CGI การดำเนินการเซิร์ฟเวอร์ HTTP ทั้งหมดจะถูกบันทึกไว้ในไดเร็กทอรีที่กำหนดค่าไว้ล่วงหน้า ไดเร็กทอรีนี้เรียกว่าไดเร็กทอรี CGI และตามแบบแผนจะตั้งชื่อว่า /var/www/cgi-bin
ไฟล์ CGI มีนามสกุล .cgi และ Perl ก็สามารถใช้นามสกุล .pl ได้เช่นกัน
ตามค่าเริ่มต้น การกำหนดค่าเซิร์ฟเวอร์ Linux จะรันในไดเร็กทอรี cgi-bin ใน /var/www
หากคุณต้องการระบุไดเร็กทอรีอื่นเพื่อรันสคริปต์ CGI คุณสามารถแก้ไขไฟล์คอนฟิกูเรชัน httpd.conf ได้ดังนี้:
<Directory "/var/www/cgi-bin"> ตัวเลือก AllowOverride ไม่มี + ExecCGI ลำดับ อนุญาต ปฏิเสธ อนุญาตจากทั้งหมด</Directory>
เพิ่มส่วนต่อท้าย .pl ลงใน AddHandler เพื่อให้เราสามารถเข้าถึงไฟล์สคริปต์ Perl ที่ลงท้ายด้วย .pl:
AddHandler cgi-สคริปต์ .cgi .pl .py
โปรแกรม CGI ครั้งแรก
ด้านล่างเราสร้างไฟล์ test.cgi โดยมีโค้ดดังนี้:
รหัส test.cgi
#!/usr/bin/perl พิมพ์ " Content-type:text/html r n r n " ; ' <html> ' ; พิมพ์ ' <head> ' ; พิมพ์ ' <meta charset="utf-8"> ' ; พิมพ์ ' <title>บทช่วย
สอน การเขียนโค้ด (codercto.com)</title> ' ; ' </head> ' ; พิมพ์ ' <body> ' ; พิมพ์ ' <h2>สวัสดีคำ! </h2> ' ; ' <p>โปรแกรม CGI แรกจากบทช่วยสอนของโปรแกรมเมอร์ </p> ' ; พิมพ์ ' </body> ' ; พิมพ์ ' </html> ' ; จากนั้นเปิด http://localhost/cgi-bin/test.cgi ผ่านเบราว์เซอร์ ผลลัพธ์ที่ได้จะเป็นดังนี้:
เนื้อหาเอาต์พุตของบรรทัดแรกของสคริปต์ "Content-type: text/htmlrnrn" จะถูกส่งไปยังเบราว์เซอร์ และแจ้งให้เบราว์เซอร์ทราบว่าประเภทเนื้อหาที่แสดงคือ "text/html"
ส่วนหัว HTTP
"Content-type:text/html" ในเนื้อหาของไฟล์ test.cgi เป็นส่วนหนึ่งของส่วนหัว HTTP ซึ่งถูกส่งไปยังเบราว์เซอร์เพื่อบอกเบราว์เซอร์ถึงประเภทเนื้อหาของไฟล์
รูปแบบของส่วนหัว HTTP เป็นดังนี้:
ชื่อฟิลด์ HTTP: เนื้อหาฟิลด์
ตัวอย่างเช่น:
ประเภทเนื้อหา: text/htmlrnrn
ตารางต่อไปนี้แนะนำข้อมูลที่ใช้กันทั่วไปในส่วนหัว HTTP ในโปรแกรม CGI:
ศีรษะ | อธิบาย |
---|
ประเภทเนื้อหา: | ข้อมูล MIME ที่ร้องขอซึ่งสอดคล้องกับเอนทิตี ตัวอย่างเช่น: Content-type:text/html |
หมดอายุ: วันที่ | วันและเวลาหมดอายุของคำตอบ |
ที่ตั้ง: URL | ใช้เพื่อเปลี่ยนเส้นทางผู้รับไปยังตำแหน่งของ URL ที่ไม่ได้ร้องขอเพื่อดำเนินการตามคำขอหรือระบุทรัพยากรใหม่ |
แก้ไขล่าสุด: วันที่ | เวลาแก้ไขล่าสุดของทรัพยากรที่ร้องขอ |
ความยาวของเนื้อหา: N | ความยาวของเนื้อหาที่ร้องขอ |
ชุดคุกกี้: สตริง | ตั้งค่าคุกกี้ HTTP |
ตัวแปรสภาพแวดล้อม CGI
โปรแกรม CGI ทั้งหมดได้รับตัวแปรสภาพแวดล้อมต่อไปนี้ ซึ่งมีบทบาทสำคัญในโปรแกรม CGI:
ชื่อตัวแปร | อธิบาย |
---|
CONTENT_TYPE | ค่าของตัวแปรสภาพแวดล้อมนี้ระบุประเภท MIME ของข้อมูลที่ถูกส่ง ในปัจจุบัน ตัวแปรสภาพแวดล้อม CONTENT_TYPE โดยทั่วไปคือ: application/x-www-form-urlencoded ซึ่งบ่งชี้ว่าข้อมูลมาจากรูปแบบ HTML |
CONTENT_LENGTH | หากวิธีการถ่ายโอนข้อมูลระหว่างเซิร์ฟเวอร์และโปรแกรม CGI คือ POST ตัวแปรสภาพแวดล้อมนี้จะเป็นจำนวนไบต์ของข้อมูลที่ถูกต้องที่สามารถอ่านได้จากอินพุตมาตรฐาน STDIN ต้องใช้ตัวแปรสภาพแวดล้อมนี้เมื่ออ่านข้อมูลที่ป้อน |
HTTP_COOKIE | เนื้อหาคุกกี้ในไคลเอนต์ |
HTTP_USER_AGENT | ให้ข้อมูลเบราว์เซอร์ของลูกค้า รวมถึงหมายเลขเวอร์ชันหรือข้อมูลที่เป็นกรรมสิทธิ์อื่นๆ |
PATH_INFO | ค่าของตัวแปรสภาพแวดล้อมนี้แสดงถึงข้อมูลเส้นทางอื่นที่อยู่ต่อจากชื่อโปรแกรม CGI มักปรากฏเป็นพารามิเตอร์สำหรับโปรแกรม CGI |
QUERY_STRING | หากวิธีการถ่ายโอนข้อมูลระหว่างเซิร์ฟเวอร์และโปรแกรม CGI คือ GET ค่าของตัวแปรสภาพแวดล้อมนี้จะเป็นข้อมูลที่ถ่ายโอน ข้อมูลนี้เป็นไปตามชื่อโปรแกรม CGI โดยคั่นด้วยเครื่องหมายคำถาม '?' |
รีโมท_ADDR | ค่าของตัวแปรสภาพแวดล้อมนี้คือที่อยู่ IP ของไคลเอ็นต์ที่ส่งคำขอ เช่น 192.168.1.67 ข้างต้น ค่านี้จะปรากฏอยู่เสมอ และเป็นตัวระบุเฉพาะที่เว็บไคลเอ็นต์จำเป็นต้องจัดเตรียมให้กับเว็บเซิร์ฟเวอร์ ซึ่งสามารถใช้ในโปรแกรม CGI เพื่อแยกแยะความแตกต่างของเว็บไคลเอ็นต์ต่างๆ |
REMOTE_HOST | ค่าของตัวแปรสภาพแวดล้อมนี้มีชื่อโฮสต์ของไคลเอ็นต์ที่ส่งคำขอ CGI หากไม่รองรับการสืบค้นที่คุณต้องการสืบค้น ก็ไม่จำเป็นต้องกำหนดตัวแปรสภาพแวดล้อมนี้ |
คำขอ_วิธีการ | จัดเตรียมวิธีการเรียกใช้สคริปต์ สำหรับสคริปต์ที่ใช้โปรโตคอล HTTP/1.0 เฉพาะ GET และ POST เท่านั้นที่มีความหมาย |
SCRIPT_FILENAME | เส้นทางแบบเต็มไปยังสคริปต์ CGI |
SCRIPT_NAME | ชื่อของสคริปต์ CGI |
SERVER_NAME | นี่คือชื่อโฮสต์ นามแฝง หรือที่อยู่ IP ของเว็บเซิร์ฟเวอร์ของคุณ |
เซิร์ฟเวอร์_ซอฟต์แวร์ | ค่าของตัวแปรสภาพแวดล้อมนี้ประกอบด้วยชื่อและหมายเลขเวอร์ชันของเซิร์ฟเวอร์ HTTP ที่เรียกใช้โปรแกรม CGI เช่น ค่าด้านบนคือ Apache/2.2.14(Unix) |
ต่อไปนี้เป็นสคริปต์ CGI ธรรมดาที่ส่งออกตัวแปรสภาพแวดล้อม CGI:
ตัวอย่าง
#!/usr/bin/perl พิมพ์ " ประเภทเนื้อหา: text/html n n " ; ' <meta charset="utf-8"> ' ; พิมพ์ " <font size=+1>ตัวแปรสภาพแวดล้อม:</font> n " ; ( เรียงลำดับ กุญแจ %ENV ) - พิมพ์ " <b> $_ </b>: $ENV { $ _ <br> n " ; 1 ; ดาวน์โหลดไฟล์
หากเราต้องการดาวน์โหลดไฟล์ผ่าน Perl CGI เราจำเป็นต้องตั้งค่าข้อมูลส่วนหัวที่แตกต่างกัน ดังที่แสดงด้านล่าง:
ตัวอย่าง
#!/usr/bin/perl # ส่วนหัว HTTP พิมพ์ " Content-
Type :application/octet-stream; name= " FileName " r n " ; " Content-Disposition: attachment; filename= " FileName " r n n " ; # เนื้อหาไฟล์จริงจะไปได้ยิน เปิด ( ไฟล์ , " <ชื่อไฟล์ " ) ; ในขณะที่ ( อ่าน ( FILE , $buffer , 100 ) - - พิมพ์ ( " $ buffer " ) ; ถ่ายโอนข้อมูลโดยใช้วิธี GET
วิธีการ GET ส่งข้อมูลผู้ใช้ที่เข้ารหัสไปยังเซิร์ฟเวอร์ ข้อมูลข้อมูลจะรวมอยู่ใน URL ของหน้าที่ร้องขอ คั่นด้วย "?" ดังที่แสดงด้านล่าง:
http://www.test.com/cgi-bin/test.cgi?key1=value1&key2=value2
หมายเหตุเพิ่มเติมบางประการเกี่ยวกับคำขอ GET:
คำขอ GET สามารถแคชได้
คำขอ GET จะยังคงอยู่ในประวัติเบราว์เซอร์
คำขอ GET สามารถบุ๊กมาร์กได้
ไม่ควรใช้คำขอ GET เมื่อจัดการข้อมูลที่ละเอียดอ่อน
คำขอ GET มีการจำกัดความยาว
คำขอ GET ควรใช้เพื่อดึงข้อมูลเท่านั้น
ตัวอย่าง URL แบบง่าย: วิธีการ GET
ต่อไปนี้เป็น URL แบบง่ายที่ใช้เมธอด GET เพื่อส่งพารามิเตอร์สองตัวไปยังโปรแกรม test.cgi:
/cgi-bin/test.cgi?name=Coder บทช่วยสอน&url=http://www.codercto.com
ต่อไปนี้เป็นรหัสของไฟล์ test.cgi:
ตัวอย่าง
#!/usr/bin/perl ท้องถิ่น ( $buffer , @pairs , $pair , $name , $value , %FORM ) #
อ่าน ข้อมูลข้อความ $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' คำขอ_วิธีการ ' } สมการ " รับ " ) - $ buffer = $ENV { ' QUERY_STRING ' } ; # อ่านข้อมูลคู่ชื่อ/ค่า @pairs = แยก ( /&/, $ buffer ) ; $คู่ ( @คู่ ) - ( $name , $value ) = แยก ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / pack ( " C " , hex ( $1 ) ) / เช่น ; $FORM { $name } = $ value ; $name = $FORM { ชื่อ } ; $url = $ FORM { url } ; " Content-type:text/html r n r n " ; " <html> " ; พิมพ์ " <head> " ; พิมพ์ ' <meta charset="utf-8"> ' ; พิมพ์ ' <title>บทช่วย
สอน การเขียนโค้ด (codercto.com)</title> ' ; " </head> " ; พิมพ์ " <body> " ; พิมพ์ " <h2> URL ชื่อ $ :
$url </h2> " ; " </body> " ; พิมพ์ " </html> " ; 1 ; ตรวจสอบเบราว์เซอร์และผลลัพธ์จะเป็นดังนี้:
ตัวอย่างแบบฟอร์มอย่างง่าย: วิธี GET
ต่อไปนี้เป็นรูปแบบ HTML ที่ใช้วิธีการ GET เพื่อส่งข้อมูลสองรายการไปยังเซิร์ฟเวอร์ สคริปต์เซิร์ฟเวอร์ที่ส่งมาก็เป็นไฟล์ test.cgi เช่นกัน รหัส test.html เป็นดังนี้:
รหัสไฟล์ test.html
< ! ด็อกไทป์ html > <html> <หัว> < เมตาดาต้า ชุดอักขระ = " utf-8 " > <title> บทช่วยสอน การเขียนโค้ด ( codercto.com ) </title> </ หัว > <ร่างกาย> < แบบฟอร์ม การกระทำ = " /cgi-bin/test.cgi " method = " get " > ชื่อไซต์: < input ประเภท = " ข้อความ " ชื่อ = " ชื่อ " > < br /> URL ไซต์: < อินพุต ประเภท = " ข้อความ " ชื่อ = " URL " - < อินพุต ประเภท = " ส่ง " ค่า = " ส่ง " - </แบบฟอร์ม> </ร่างกาย> </html> ในเบราว์เซอร์ ผลการดำเนินการจะเป็นดังนี้:
ส่งข้อมูลโดยใช้วิธี POST
มีความปลอดภัยและเชื่อถือได้มากกว่าหากใช้วิธี POST เพื่อส่งข้อมูลไปยังเซิร์ฟเวอร์ ข้อมูลที่ละเอียดอ่อนบางอย่าง เช่น รหัสผ่านผู้ใช้ จำเป็นต้องใช้ POST เพื่อส่งข้อมูล
ต่อไปนี้คือ test.cgi ซึ่งสามารถจัดการข้อมูลแบบฟอร์ม POST ที่ส่งโดยเบราว์เซอร์ได้:
รหัส test.cgi
#!/usr/bin/perl ท้องถิ่น ( $buffer , @pairs , $pair , $name , $value , %FORM ) #
อ่าน ข้อมูลข้อความ $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' คำขอ_วิธีการ ' } สมการ " โพสต์ " ) - อ่าน ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; - $ buffer = $ENV { ' QUERY_STRING ' } ; # อ่านข้อมูลคู่ชื่อ/ค่า @pairs = แยก ( /&/, $ buffer ) ; $คู่ ( @คู่ ) - ( $name , $value ) = แยก ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / pack ( " C " , hex ( $1 ) ) / เช่น ; $FORM { $name } = $ value ; $name = $FORM { ชื่อ } ; $url = $ FORM { url } ; " Content-type:text/html r n r n " ; " <html> " ; พิมพ์ " <head> " ; พิมพ์ ' <meta charset="utf-8"> ' ; พิมพ์ ' <title>บทช่วย
สอน การเขียนโค้ด (codercto.com)</title> ' ; " </head> " ; พิมพ์ " <body> " ; พิมพ์ " <h2> URL ชื่อ $ :
$url </h2> " ; " </body> " ; พิมพ์ " </html> " ; 1 ; ต่อไปนี้เป็นรูปแบบ HTML ที่ใช้วิธีการ GET เพื่อส่งข้อมูลสองรายการไปยังเซิร์ฟเวอร์ สคริปต์เซิร์ฟเวอร์ที่ส่งมาก็เป็นไฟล์ test.cgi เช่นกัน รหัส test.html เป็นดังนี้:
รหัส test.html
< ! ด็อกไทป์ html > <html> <หัว> < เมตาดาต้า ชุดอักขระ = " utf-8 " > <title> บทช่วยสอน การเขียนโค้ด ( codercto.com ) </title> </ หัว > <ร่างกาย> < แบบฟอร์ม การกระทำ = " /cgi-bin/test.cgi " method = " post " > ชื่อไซต์: < input ประเภท = " ข้อความ " ชื่อ = " ชื่อ " > < br /> URL ไซต์: < อินพุต ประเภท = " ข้อความ " ชื่อ = " url " - < อินพุต ประเภท = " ส่ง " ค่า = " ส่ง " - </แบบฟอร์ม> </ร่างกาย> </html> ในเบราว์เซอร์ ผลการดำเนินการจะเป็นดังนี้:
ส่งข้อมูลช่องทำเครื่องหมายผ่านโปรแกรม CGI
ช่องทำเครื่องหมายใช้เพื่อส่งข้อมูลตัวเลือกตั้งแต่หนึ่งรายการขึ้นไป รหัส test.html มีดังนี้:
รหัส test.html
< ! ด็อกไทป์ html > <html> <หัว> < เมตาดาต้า ชุดอักขระ = " utf-8 " > <title> บทช่วยสอน การเขียนโค้ด ( codercto.com ) </title> </ หัว > <ร่างกาย> < แบบฟอร์ม การกระทำ = " /cgi-bin/test.cgi " วิธีการ = " โพสต์ " เป้าหมาย = " _blank " > < อินพุต ประเภท = " ช่องทำเครื่องหมาย " ชื่อ = " codercto " ค่า = " บน " /> บทช่วยสอน Coder < อินพุต ประเภท = " ช่องทำเครื่องหมาย " ชื่อ = " กูเกิล " ค่า = " บน " /> Google < อินพุต ประเภท = " ส่ง " value = " เลือกไซต์ " - </แบบฟอร์ม> </ร่างกาย> </html> ต่อไปนี้เป็นรหัสของไฟล์ test.cgi:
รหัส test.cgi
#!/usr/bin/perl ท้องถิ่น ( $buffer , @pairs , $pair , $name , $value , %FORM ) # อ่านข้อมูล $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' คำขอ_วิธีการ ' } สมการ " โพสต์ " ) - อ่าน ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; - $ buffer = $ENV { ' QUERY_STRING ' } ; # อ่านข้อมูลคู่ชื่อ/ค่า @pairs = แยก ( /&/, $ buffer ) ; $คู่ ( @คู่ ) - ( $name , $value ) = แยก ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / pack ( " C " , hex ( $1 ) ) / เช่น ; $FORM { $name } = $ value ; ถ้า ( $FORM { โคเดอร์กโต } ) { $codercto_flag = " เปิด " } อื่น ๆ { $ codercto_flag = " ปิด " ; ถ้า ( $ แบบฟอร์ม { google } ) { $google_flag = " เปิด " } อื่น ๆ { $ google_flag = " ปิด " ; พิมพ์ " Content-type:text/html r n r n " ; " <html> " ; พิมพ์ " <head> " ; พิมพ์ ' <meta charset="utf-8"> ' ; พิมพ์ ' <title>บทช่วย
สอน การเขียนโค้ด (codercto.com)</title> ' ; " </head> " ; พิมพ์ " <body> " ; พิมพ์ " <h2> สถานะการสอน Coder ที่เลือก: $ codercto_flag </h2> " ; " <h2> สถานะการเลือกของ Google: $ google_flag </h2> " ; " </body> " ; พิมพ์ " </html> " ; 1 ; ในเบราว์เซอร์ ผลการดำเนินการจะเป็นดังนี้:
ส่งข้อมูลวิทยุผ่านโปรแกรม CGI
วิทยุส่งข้อมูลเดียวไปยังเซิร์ฟเวอร์เท่านั้น รหัส test.html เป็นดังนี้:
รหัส test.html
< ! ด็อกไทป์ html > <html> <หัว> < เมตาดาต้า ชุดอักขระ = " utf-8 " > <title> บทช่วยสอน การเขียนโค้ด ( codercto.com ) </title> </ หัว > <ร่างกาย> < แบบฟอร์ม การกระทำ = " /cgi-bin/test.cgi " วิธีการ = " โพสต์ " เป้าหมาย = " _blank " > < อินพุต ประเภท = " วิทยุ " ชื่อ = " ไซต์ " ค่า = " codercto " /> บทช่วยสอน Coder < อินพุต ประเภท = " วิทยุ " ชื่อ = " ไซต์ " ค่า = " กูเกิล " /> Google < อินพุต ประเภท = " ส่ง " ค่า = " ส่ง " - </แบบฟอร์ม> </ร่างกาย> </html> รหัสสคริปต์ test.cgi เป็นดังนี้:
รหัส test.cgi
#!/usr/bin/perl ท้องถิ่น ( $buffer , @pairs , $pair , $name , $value , %FORM ) #
อ่าน ข้อมูล $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' คำขอ_วิธีการ ' } สมการ " โพสต์ " ) - อ่าน ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; - $ buffer = $ENV { ' QUERY_STRING ' } ; # อ่านข้อมูลคู่ชื่อ/ค่า @pairs = แยก ( /&/, $ buffer ) ; $คู่ ( @คู่ ) - ( $name , $value ) = แยก ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / pack ( " C " , hex ( $1 ) ) / เช่น ; $FORM { $name } = $ value ; $site = $FORM { เว็บไซต์ } ; พิมพ์ " Content-type:text/html r n r n " ; " <html> " ; พิมพ์ " <head> " ; พิมพ์ ' <meta charset="utf-8"> ' ; พิมพ์ ' <title>บทช่วย
สอน การเขียนโค้ด (codercto.com)</title> ' ; " </head> " ; พิมพ์ " <body> " ; พิมพ์ " <h2> เว็บไซต์ที่เลือก $ site </h2> " ; " </body> " ; พิมพ์ " </html> " ; 1 ; ในเบราว์เซอร์ ผลการดำเนินการจะเป็นดังนี้:
ส่งข้อมูล Textarea ผ่านโปรแกรม CGI
Textarea ส่งข้อมูลหลายบรรทัดไปยังเซิร์ฟเวอร์ รหัส test.html เป็นดังนี้:
รหัส test.html
< ! ด็อกไทป์ html > <html> <หัว> < เมตาดาต้า ชุดอักขระ = " utf-8 " > <title> บทช่วยสอน การเขียนโค้ด ( codercto.com ) </title> </ หัว > <ร่างกาย> < แบบฟอร์ม การกระทำ = " /cgi-bin/test.cgi " วิธีการ = " โพสต์ " เป้าหมาย = " _blank " > < พื้นที่ข้อความ ชื่อ = " เนื้อหาข้อความ " คอลอส = " 40 " rows = " 4 " > ใส่เนื้อหาที่นี่... </ textarea > < อินพุต ประเภท = " ส่ง " ค่า = " ส่ง " - </แบบฟอร์ม> </ร่างกาย> </html> รหัสสคริปต์ test.cgi เป็นดังนี้:
รหัส test.cgi
#!/usr/bin/perl ท้องถิ่น ( $buffer , @pairs , $pair , $name , $value , %FORM ) # อ่านข้อมูล $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' คำขอ_วิธีการ ' } สมการ " โพสต์ " ) - อ่าน ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; - $ buffer = $ENV { ' QUERY_STRING ' } ; # อ่านข้อมูลคู่ชื่อ/ค่า @pairs = แยก ( /&/, $ buffer ) ; $คู่ ( @คู่ ) - ( $name , $value ) = แยก ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / pack ( " C " , hex ( $1 ) ) / เช่น ; $FORM { $name } = $ value ; $text_content = $FORM { เนื้อหา ข้อความ } ; " Content-type:text/html r n r n " ; " <html> " ; พิมพ์ " <head> " ; พิมพ์ ' <meta charset="utf-8"> ' ; พิมพ์ ' <title>บทช่วย
สอน การเขียนโค้ด (codercto.com)</title> ' ; " </head> " ; พิมพ์ " <body> " ; พิมพ์ " <h2>เนื้อหาข้อความที่ป้อนคือ: $ text_content </h2> " ; " </body> " ; พิมพ์ " </html> " ; 1 ; ในเบราว์เซอร์ ผลการดำเนินการจะเป็นดังนี้:
ส่งข้อมูลแบบเลื่อนลงผ่านโปรแกรม CGI
รหัสกล่องแบบหล่นลง HTML เป็นดังนี้:
รหัส test.html
< ! ด็อกไทป์ html > <html> <หัว> < เมตาดาต้า ชุดอักขระ = " utf-8 " > <title> บทช่วยสอน การเขียนโค้ด ( codercto.com ) </title> </ หัว > <ร่างกาย> < แบบฟอร์ม การกระทำ = " /cgi-bin/test.cgi " วิธีการ = " โพสต์ " เป้าหมาย = " _blank " > < เลือก ชื่อ = " แบบเลื่อนลง " > < ตัวเลือก ค่า = " codercto " เลือก > การสอนการใช้โค้ดเดอร์ </ ตัวเลือก > < ตัวเลือก ค่า = " google " > Google </ ตัวเลือก > </เลือก> < อินพุต ประเภท = " ส่ง " ค่า = " ส่ง " /> </แบบฟอร์ม> </ร่างกาย> </html> รหัสสคริปต์ test.cgi เป็นดังนี้:
รหัส test.cgi
#!/usr/bin/perl ท้องถิ่น ( $buffer , @pairs , $pair , $name , $value , %FORM ) #
อ่าน ข้อมูล $ENV { ' REQUEST_METHOD ' } =~ tr / a - z / A - Z / ; ( $ENV { ' คำขอ_วิธีการ ' } สมการ " โพสต์ " ) - อ่าน ( STDIN , $ buffer , $ ENV { ' CONTENT_LENGTH ' } ) ; - $ buffer = $ENV { ' QUERY_STRING ' } ; # อ่านข้อมูลคู่ชื่อ/ค่า @pairs = แยก ( /&/, $ buffer ) ; $คู่ ( @คู่ ) - ( $name , $value ) = แยก ( /=/, $pair ) ; $value =~ tr /+/ / ; $value =~ s / % ( .. ) / pack ( " C " , hex ( $1 ) ) / เช่น ; $FORM { $name } = $ value ; $site = $FORM { แบบ เลื่อนลง } ; " Content-type:text/html r n r n " ; " <html> " ; พิมพ์ " <head> " ; พิมพ์ ' <meta charset="utf-8"> ' ; พิมพ์ ' <title>บทช่วย
สอน การเขียนโค้ด (codercto.com)</title> ' ; " </head> " ; พิมพ์ " <body> " ; พิมพ์ " <h2>เว็บไซต์ที่เลือกคือ: $ site </h2> " ; " </body> " ; พิมพ์ " </html> " ; 1 ; ในเบราว์เซอร์ ผลการดำเนินการจะเป็นดังนี้:
การใช้คุกกี้ใน CGI
ข้อบกพร่องที่สำคัญของโปรโตคอล http คือไม่ได้ตัดสินตัวตนของผู้ใช้ซึ่งทำให้โปรแกรมเมอร์ไม่สะดวกอย่างมาก การเกิดขึ้นของฟังก์ชันคุกกี้ชดเชยข้อบกพร่องนี้
คุกกี้เขียนข้อมูลบันทึกบนฮาร์ดไดรฟ์ของลูกค้าผ่านเบราว์เซอร์ของลูกค้าเมื่อลูกค้าเข้าถึงสคริปต์ ข้อมูลข้อมูลจะถูกดึงออกมาในครั้งถัดไปที่ลูกค้าเข้าถึงสคริปต์ ดังนั้นการบรรลุฟังก์ชั่นการเลือกปฏิบัติตัวตน คุกกี้มักจะใช้ในการยืนยันตัวตน
ไวยากรณ์ของคุกกี้
การส่งคุกกี้ http ดำเนินการผ่านส่วนหัว http ซึ่งเร็วกว่าการถ่ายโอนไฟล์ ไวยากรณ์ของส่วนหัว set-cookie จะเป็นดังนี้:
ชุดคุกกี้: ชื่อ = ชื่อ; หมดอายุ = วันที่; เส้นทาง = เส้นทาง; โดเมน = โดเมน; ปลอดภัย
name=name: ต้องตั้งค่าคุกกี้ (ชื่อไม่สามารถใช้ " ; " และ " , ") ใช้ " ; " เพื่อแยกค่าของชื่อหลายค่า เช่น name1=name1;name2=name2;name3=name3
หมดอายุ=วันที่: ระยะเวลาที่คุกกี้ใช้งานได้ รูปแบบ: หมดอายุ="Wdy,DD-Mon-YYYY HH:MM:SS"
path=path: กำหนดเส้นทางที่คุกกี้รองรับ หาก path เป็นพาธ คุกกี้จะมีผลกับไฟล์และไดเร็กทอรีย่อยทั้งหมดในไดเร็กทอรีนี้ ตัวอย่างเช่น: path="/cgi-bin/" คุกกี้จะมีผลใช้บังคับกับไฟล์นี้ เช่น: path="/cgi-bin/cookie.cgi"
domain=domain: ชื่อโดเมนที่มีผลกับคุกกี้ เช่น: domain="www.codercto.com"
ปลอดภัย: หากได้รับแฟล็กนี้ หมายความว่าคุกกี้สามารถส่งผ่านเซิร์ฟเวอร์ https ที่มีโปรโตคอล SSL เท่านั้น
การรับคุกกี้ทำได้โดยการตั้งค่าตัวแปรสภาพแวดล้อม HTTP_COOKIE โปรแกรม CGI สามารถรับข้อมูลคุกกี้ได้โดยการดึงตัวแปรนี้
การตั้งค่าคุกกี้
การตั้งค่าคุกกี้นั้นง่ายมาก คุกกี้จะถูกส่งแยกกันในส่วนหัว http ตัวอย่างต่อไปนี้จะตั้งค่า UserID, รหัสผ่าน และหมดอายุในคุกกี้:
ตัวอย่าง
#!/usr/bin/perl พิมพ์ " Set-Cookie:
UserID =XYZ; n " ; " Set-Cookie:Password=XYZ123; n " ; " Set-Cookie:Expires=วันอังคาร, 31-Dec-2017 23:12:40 GMT " ; n " ;print " Set - Cookie : Domain = www . codercto 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 = แยก / ; / , $rcvd_cookies ; $คุกกี้ - @คุกกี้ ) { ( $key , $val ) = split ( /=/, $cookie ) ; # แยกในครั้งแรก =. $ key = ~ s / s +//; $val =~ s / ^ s + // ; $ key = ~ s / s + $ // ; /; ถ้า ( $คีย์ สมการ " รหัสผู้ใช้ " ) { $user_id = $val ; } elsif ( $key สมการ " รหัสผ่าน " ) { $รหัสผ่าน = $ วาล ; - พิมพ์ " รหัสผู้
ใช้ = $user_id n " ; " รหัสผ่าน = $รหัสผ่าน n " ; ผลลัพธ์ที่ได้ของตัวอย่างข้างต้นคือ:
รหัสผู้ใช้ = XYZPassword = XYZ123
โมดูลซีจีไอ
Perl มีโมดูล CGI ในตัวมากมาย โดยทั่วไปจะใช้สองโมดูลต่อไปนี้:
โมดูลซีจีไอ
เบิร์กลีย์ cgi-lib.pl