เวลาที่มีการเรียกใช้งานโปรแกรม
CGI (หลังจากนี้จะเรียกโปรแกรม
gateway
ที่ทำงานกับ
CGI
ว่าโปรแกรม
CGI) ตัวแปร environment
ต่างๆของระบบก็จะถูกกำหนดค่าขึ้น
ลองดูตัวอย่างตัวแปร
environment ที่ url
ข้างล่างนี้
โปรแกรม CGI
กับความปลอดภัย
ควรระวังให้มากๆ
โปรแกรม CGI
คือโปรแกรมที่ใครก็ได้เข้ามาใช้งาน
บน server ของคุณ
พยายามตรวจสอบช่องโหว่ของโปรแกรม
CGI
ของคุณให้มากที่สุด
มีความสำคัญมากๆเท่ากับ(หรืออาจจะมากกว่า)ขั้นตอนในการเขียนโปรแกรมเช่นกัน
ที่สำคัญที่สุดคือ
อย่าเชื่อใจผู้ใช้งาน
เชื่อได้แค่ไหนว่าสิ่งที่เขากรอกมาใน
form
นั้นปลอดภัย?
สมมุติว่าเรามีโปรแกรม
CGI
โปรแกรมหนึ่ง
ซึ่งอนุญาตให้ผู้ใช้งานเรียกใช้โปรแกรม
"finger" บน host
ของเราได้
ยกตัวอย่างด้วยภาษา
Perl
บรรทัดนึงดังนี้
system "finger $username";
แต่ถ้ามีผู้ไม่หวังดี
กรอกข้อความ
"james; rm -r /"
ไว้ในตัวแปร
username
โปรแกรมของคุณจะกระทำคำสั่ง
system "finger jame; rm -r /";
ซึ่งจะลบแฟ้มข้อมูลในระบบของคุณออก(เท่าที่มีสิทธิ์ลบได้!)
เพื่อไม่ให้เกิดปัญหานี้ขึ้น
จะต้องตรวจสอบข้อมูลที่ได้รับจากผู้ใช้เสียก่อน
เช่นใช้คำสั่งต่อไปนี้เข้าช่วย
$username!~/[^\w.-]/ || die "Wow! what do you want..";
หรือใช้รูปแบบอื่นของคำสั่ง
command เช่น
system("finger",$username);
ควรจะระมัดระวังในจุดนี้ให้มากๆ
ที่อยู่ของโปรแกรม
cgi
Web server
มีต่างๆกันหลายแบบ
บาง server
อนุญาตให้นำโปรแกรม
CGI ไว้ใน directory
เดียวกับ html
โดยกำหนดให้นามสกุลไฟล์เป็น
".cgi"
ในขณะที่บาง
server
กำหนดให้คุณนำโปรแกรม
CGI ใส่ไว้ใน directory
ที่กำหนดไว้เช่น
"cgi-bin"
แล้วจะกำหนดโปรแกรม
CGI
ของผมอย่างไรดี?
ผู้ดูแลระบบของคุณจะช่วยตอบคำถามเหล่านี้ได้
ต้องกำหนด
permission
ไฟล์โปรแกรม
CGI
ที่ถูกต้อง
ในระบบ Unix ตัว
web server (และ process
อื่นๆ)จะทำงานภายใต้ชื่อผู้ใช้ชื่อใดชื่อหนึ่ง
โปรแกรม CGI
ของคุณก็จะถูกสั่งให้ทำงานด้วยชื่อผู้ใช้ชื่อเดียวกันนั่นเอง
จึงต้องกำหนด
permission
ของโปรแกรม
CGI
ด้วยคำสั่ง
"chmod 755 *.pl"
เพื่อให้ผู้ใช้อื่นๆสามารถเรียกใช้โปรแกรม
CGI
ของคุณได้ด้วย
(ระมัดระวังเรื่อง
permission ให้ดี)
ตัวแปร Environment
ที่ควรจำ
REQUEST_METHOD
เป็นวิธีการที่โปรแกรม
CGI
ถูกเรียกใช้
เช่น "GET"
หรือ "POST"
HTTP_REFERER
URL ที่ form
ถูกส่งมา
ตัวแปรนี้ไม่ได้ถูกกำหนดเสมอไป
อย่ายึดติดกับมันมากนัก
SERVER_NAME
ชื่อหรือ IP address
ของเครื่อง
server
SCRIPT_NAME
local URL
ของโปรแกรม
CGI
ที่จะทำงาน
มาตรฐานของ
CGI
ไม่ได้กำหนดไว้ว่าต้องมี
/
ด้วยหรือไม่
ควรจะเขียนชุดคำสั่งเพิ่มเติมให้แน่นอนว่ามี
/ ตามท้าย
สำหรับในภาษา
Perl
ให้ใช้ชุดคำสั่งต่อไปนี้:
$ENV{'SCRIPT_NAME'}=~s#^/?#/#;
ในภาษา Perl
หากต้องการอ้างอิงถึง
URL
ของโปรแกรม
CGI
ที่จะทำงานจะเป็นดังต่อไปนี้
"http://$ENV{'SERVER_NAME'}:$ENV{'SERVER_PORT'}$ENV{'SCRIPT_NAME'}"
URL
ที่สมบูรณ์ของโปรแกรม
CGI
จะประกอบไปด้วย
PATH_INFO และ QUERY_STRING
ต่อท้ายด้วย
ข้อแตกต่างระหว่างวิธี
GET และ POST
GET และ POST
เป็นวิธีที่ต่างกัน
แต่เป็นวิธีการส่งข้อมูลให้กับ
server ทั้งคู่
โดยทั่วไป GET
ใช้สำหรับเรียกไฟล์หรือทรัพยากรอื่นๆจาก
web server
โดยสามารถมี
parameter
ระบุไว้ตามที่ต้องการได้
ในกรณีของการรับข้อมูลจาก
form URL ของการ GET
จะเป็น
http://myhost.com/mypath/myscript.cgi?name1=value1&name2=value2
GET
คือวิธีการที่
browser
ใช้ในการดาว์นโหลดแฟ้มข้อมูล
เช่นเอกสาร
HTML
หรือรูปภาพ
และยังสามารถใช้ในการส่งข้อมูลจาก
form ได้ด้วย
ถ้าหากว่าข้อมูลนั้นไม่มากจนเกินไป(ข้อจำกัดของขนาดข้อมูลขึ้นอยู่กับ
browser)
ผลกระทบของการใช้วิธีการ
GET คือ browser และ proxy
จะสามารถจดจำผลลัพธ์ของการ
GET ไว้ใน cache ได้
เพราะฉนั้นในการเรียกใช้โปรแกรมด้วยวิธี
GET
หลายครั้งอาจจะได้ผลลัพธ์เก่าออกมาก็เป็นได้
ดังนั้นจึงไม่ควรใช้วิธี
GET
ถ้าหากว่าต้องการที่จะเก็บข้อมูลสำหรับการเรียกใช้โปรแกรมแต่ละครั้งเฉพาะเป็นครั้งๆไป
หรือกับโปรแกรม
CGI
ที่ต้องการที่จะนำเสนอข้อมูลที่ใหม่(update)เสมอทุกครั้งที่มีการเรียกใช้
โดยปกติแล้ว
POST
ใช้สำหรับส่งข้อมูลไปให้
server
เพื่อประมวลผล
เมื่อ HTML form
ส่งออกไปยัง
server
ด้วยวิธีการ
POST
ข้อมูลของคุณจะ
attach
ไปกับส่วนท้ายของข้อมูลร้องขอใช้งานโปรแกรม
เวลาใช้งานวิธี
POST
อาจจะไม่ง่ายและเร็วเท่ากับการใช้วิธี
GET
แต่สามารถทำงานกับข้อมูลที่สลับซับซ้อนได้ดีกว่า
คุณสามารถส่งแฟ้มข้อมูลไปกับวิธีการ
POST
ได้ด้วยเช่นกัน
ขนาดของข้อมูลที่จะส่งจะไม่ถูกจำกัดเหมือนวิธีการ
GET
อย่างไรก็ตามสำหรับผู้เขียนโปรแกรม
CGI แล้ว
ทั้งวิธีการ
GET และ POST
ต่างก็ไม่ยากที่จะใช้งานด้วยกันทั้งคู่
ข้อดีของวิธีการ
POST คือ
วิธีการ POST
ทำให้สามารถส่งข้อมูลได้ไม่จำกัดขนาด
และสามารถนับจากโปรแกรม
CGI
ได้จริงๆว่ามีการเรียกใช้โปรแกรมกี่ครั้ง
ส่วนข้อดีสำหรับการใช้วิธี
GET
ข้อมูลจากการกรอก
form
ทั้งหมดจะถูกส่งไปเป็น
URL เดียว
สามารถจะใช้ผ่าน
hyperlink หรือ bookmark
ได้โดยไม่ต้องกรอกฟอร์มทุกครั้ง