You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不借助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 13:27:00