ข้อความรู้สำหรับ CGI
เวลาที่มีการเรียกใช้งานโปรแกรม 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 ได้โดยไม่ต้องกรอกฟอร์มทุกครั้ง

 

เนื้อหาส่วนถัดไป.. ->