如何不借助JavaScript仅通过C(CGI)读取Cookie实现身份验证
该需求完全可以实现,不需要依赖任何JavaScript
CGI 规范本身已经定义了请求头的传递方式,浏览器发送的 Cookie 会被 Web 服务器自动存入名为 HTTP_COOKIE 的环境变量,不需要通过 stdin 传递,stdin 仅用于接收 POST 请求的请求体数据。
实现步骤
你只需要用 C 标准库的 getenv() 函数即可直接读取到完整的 Cookie 字符串,后续解析出身份凭证字段就能做登出判断、访问控制逻辑。
以下是最小可运行示例:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *cookie_str = getenv("HTTP_COOKIE"); // 先输出必要的CGI响应头,头和内容之间必须有空行 printf("Content-Type: text/html; charset=utf-8\r\n\r\n"); if (cookie_str == NULL) { printf("<p>无登录凭证,请先登录</p>"); return 0; } // 解析你预设的身份凭证Cookie,例如你设置的用户ID字段名为uid char *uid_pos = strstr(cookie_str, "uid="); if (uid_pos == NULL) { printf("<p>无有效登录凭证,请先登录</p>"); return 0; } // 提取uid值,跳过"uid="前缀的4个字符 uid_pos += 4; char *uid_end = strchr(uid_pos, ';'); char uid[64] = {0}; if (uid_end) { strncpy(uid, uid_pos, uid_end - uid_pos); } else { strncpy(uid, uid_pos, sizeof(uid) - 1); } // 此处加入你的业务逻辑:判断该uid是否在登出有效期的禁止访问名单内 // 是的话直接返回403状态或者跳转登录页即可 printf("<p>当前用户ID:%s</p>", uid); // 登出操作的实现:返回Set-Cookie头将uid过期即可,示例: // printf("Set-Cookie: uid=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; HttpOnly\r\n"); return 0; }
注意事项
- 解析 Cookie 时要注意多 Cookie 以
;(分号加空格)分隔,如果你的凭证值存在 URL 编码字符,需要额外做解码处理 - 身份相关的 Cookie 建议设置
HttpOnly属性,禁止前端脚本读取,HTTPS 站点可额外加Secure属性提升安全性 - 整个流程完全不需要前端 JavaScript 参与:浏览器会自动把对应域名下的 Cookie 附加在每次 HTTP 请求头中,Web 服务器会自动处理并写入环境变量供 CGI 程序读取
内容的提问来源于stack exchange,提问作者Quorthon Plavi
相关产品推荐
相关产品推荐

