| 變數 | 說明 |
| REQUEST_METHOD | GET 或 POST(決定資料來源) |
| CONTENT_LENGTH | POST 資料位元組數 |
| QUERY_STRING | GET 參數字串(URL ? 後內容) |
| CONTENT_TYPE | POST 資料 MIME 類型(通常 application/x-www-form-urlencoded) |
| HTTP_COOKIE | 客戶端 Cookie |
| HTTP_USER_AGENT | 瀏覽器識別字串 |
| REMOTE_ADDR | 客戶端 IP |
| SERVER_NAME/PORT/PROTOCOL | 伺服器資訊 |
資料編碼與解析
- GET: 參數附加於 URL,經 URL 編碼(空格→
+ 或 %20,特殊字元→%XX),從 QUERY_STRING 取得。
- POST: 資料在請求主體,長度由
CONTENT_LENGTH 指定,從 stdin 讀取,格式同 GET(application/x-www-form-urlencoded)或 multipart/form-data(檔案上傳)。
解碼步驟:+→空格 → %XX→對應 ASCII 字元 → 以 & 分割鍵值對 → 以 = 分割鍵值。
C/C++ CGI 程式骨架
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *method = getenv("REQUEST_METHOD");
char *query = getenv("QUERY_STRING");
int len = atoi(getenv("CONTENT_LENGTH") ?: "0");
char *input = malloc(len + 1);
if (strcmp(method, "POST") == 0) fread(input, 1, len, stdin);
else strcpy(input, query);
input[len] = '\0';
// 解析 input 取得參數...
printf("Content-Type: text/html\r\n\r\n");
printf("<html><body>Hello CGI!</body></html>");
return 0;
}
安全與效能注意
- 嚴格驗證所有輸入長度、字元,防緩衝區溢位、命令注入、XSS。
- 每請求啟動新行程開銷大,高流量建議改用 FastCGI、ISAPI、ASP.NET Core 等常駐模型。
- 輸出 Header 必須以空行結束(
\r\n\r\n),否則伺服器視為 Header 未結束。
- 上一篇文章: WinSock 網路程式設計核心:阻塞/非阻塞、異步選擇與 MFC CSocket
- 下一篇文章: WinCGI:Windows 平台更友善的 CGI 開發模式
Copyright ©
程式碼之家 All Rights Reserved