0x01:什麼是CGI編程?
CGI:Common Gateway Interface
CGI代表Common Gateway Interface(通用網關界面),它使在網絡服務器下運行外部分應用程序(或網關)成為可能。
CGI-BIN 目錄是存放CGI腳本的地方。
這些腳本使WWW服務器和浏覽器能運行外部程序,而無需啟動另一個原因程序。
它是運行在Web服務器上的一個程序,並由來自於浏覽者的輸人觸發。CGI是在HTTP服務器下運行外部程序(或網關)的一個接口,它能讓網絡用戶訪問遠程系統上的使用類型程序,就好像他們在實際使用那些遠程計算機一樣。 CGI能夠讓浏覽者與服務器進行交互,如果你曾經遇到過在網絡上填表或者進行搜索,就很有可能就是用的CGI。
0x02:用什麼語言可以編寫CGI編程?
CGI應用程序可以由大多數的編程語言編寫,如Perl(Practical Extraction and Report Language)、C\C++、Java 和Visual Basic等。不過對於那些沒有太多編程經驗的網頁制作人來說,實在是一個不小的難題(測試CGI程序需要html測試文件)。
0x03:CGI應用程序的工作原理
1.浏覽器通過HTML表單或超鏈接請求指上一個CGI應用程序的URL。
2.服務器收發到請求。
3.服務器執行指定所CGI應用程序。
4.CGI應用程序執行所需要的操作,通常是基於浏覽者輸人的內容。
5.CGI應用程序把結果格式化為網絡服務器和浏覽器能夠理解的文檔(通常是HTML網頁)。
6.網絡服務器把結果返回到浏覽器中。
0x04:CGI程序實現
C語言實現代碼:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 char from_hex(char ch) 6 { 7 return isdigit(ch) ? ch - '0' : tolower(ch) - 'a' + 10; 8 } 9 10 char * gb2312_to_chinese(char *gb2312)//將gb2312編碼轉換為漢字 11 { 12 if (strstr(gb2312, "%")) 13 { 14 char *buf = (char *)malloc(strlen(gb2312) + 1); 15 char *pstr = gb2312; 16 char *pbuf = buf; 17 while (*pstr) 18 { 19 if (*pstr == '%') 20 { 21 if (pstr[1] && pstr[2]) 22 { 23 *pbuf++ = from_hex(pstr[1]) << 4 | from_hex(pstr[2]); 24 pstr += 2; 25 } 26 } 27 else if (*pstr == '+') 28 { 29 *pbuf++ = ' '; 30 } 31 else 32 { 33 *pbuf++ = *pstr; 34 } 35 pstr++; 36 } 37 *pbuf = '\0'; 38 return buf; 39 } 40 } 41 42 void main() 43 { 44 printf("Content-type:text/html \n\n");//HTML語言 45 char searchstr[256] = ""; 46 gets(searchstr);//從浏覽器獲得輸入 47 char *p = strchr(searchstr, '&');//處理從浏覽器獲取的輸入,去掉多余的部分 searchstr[256] = "我們的輸入&%ds%ads%fadsa8d8hd" 48 if (p != NULL) 49 { 50 *p = '\0'; 51 } 52 char *pstart = searchstr + 10; 53 pstart = gb2312_to_chinese(pstart);//從浏覽器獲取到的輸入時改變312編碼方式 需要轉換成漢字 才能進行查找 54 int j = 0; 55 char pathr[200] = "kaifang.txt"; 56 FILE *pfr = fopen(pathr, "r");//打開開房數據 57 if (pfr == NULL) 58 { 59 puts("打開失敗"); 60 return; 61 } 62 else 63 { 64 while (!feof(pfr)) 65 { 66 char buffer[256] = { 0 }; 67 fgets(buffer, 256, pfr); 68 char *p = strstr(buffer, pstart); 69 if (p != NULL) 70 { 71 j++;//計數器 72 puts(buffer); 73 puts("<br><br>");//換行 74 } 75 } 76 puts("<br><br>");//換行 77 printf("找完了,找到 %d 個 %s ", j, pstart); 78 puts("<br><br>");//換行 79 puts("<br><br>");//換行 80 } 81 }
測試CGI程序所用的html文件:
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> 5 <title>酒店開房記錄查詢</title> 6 <style> 7 a:visited{color:#0000FF;} 8 #div{width:600px;margin:0 auto}; 9 </style> 10 </head> 11 <body> 12 <div id="div"> 13 <table > 14 <tr> 15 <td> 16 <p align="center"><img src="logo.gif" width="270" height="129" usemap="#mp"/></p> 17 </td> 18 </tr> 19 <tr> 20 <td> 21 <p align="center"> 22 <form id = "form" name = "form" method = "post" action = "http://127.0.0.1/cgi-bin/xxoo.cgi"> 23 <input type="text" name="searchstr" placeholder="請輸入你的那個他(她),看看有沒有出軌"/> 24 <input type="submit" name="sousuoanniu" value="猥瑣一下" /> 25 </p> 26 </td> 27 </tr> 28 <tr> 29 <tr> 30 <tr> 31 <tr> 32 <td> 33 <p align="center"> 34 <font size="2">酒店開放記錄查詢 已經總共2000萬用戶信息洩漏</font> 35 36 </p> 37 <br> 38 <br> 39 <br> 40 <br> 41 <br> 42 <br> 43 <br> 44 <p align="center"> 45 <font size="2"> 46 友情提醒:數據來源於網絡僅供參考,使用時請遵守當地法律法規 47 48 </font> 49 </p> 50 </td> 51 </tr> 52 </table> 53 </div> 54 </body> 55 </html>
0x05:測試效果
環境:Apache2.2,WIN8.1
找到Apache的安裝目錄將寫好的CGI程序生成為.exe可執行程序,將後綴改為.cgi然後放在Apache 2.2\cgi-bin目錄下
將測試CGI程序所用的html文件放在Apache 2.2\htdocs目錄下
效果:
0x06:注意
printf("Content-type:text/html \n\n");//HTML語言
此行通過標准輸出將字符串″Contenttype:text/plain/n/n″傳送給Web服務器。它是一個MIME頭信息,它告訴Web服務器隨 後的輸出是以純ASCII文本的形式。請注意在這個頭信息中有兩個換行符,這是因為Web服務器需要在實際的文本信息開始之前先看見一個空行。