关于linux c的CGI cookie配置

来源:互联网 发布:淘宝配眼镜靠谱吗 知乎 编辑:程序博客网 时间:2024/06/05 14:39

公司vpn登录本地web,cookie超时问题,

描述如下:
本地web登录正常 超时后再次登录正常

vpnweb登录正常 超时后再次登录不正常(操作其他按钮就退出来了)


后来查是cgi的env变量在获取vpn通道的web地址不正确: 

    cgiGetenv(&cgiRemoteAddr, "REMOTE_ADDR");    cgiGetenv(&cgiRemoteIdent, "REMOTE_IDENT");

问题产生流程:
登录时拿到的ip:192.168.1.99
登录后页面校验拿到的ip:10.60.0.220,如果当前没超时并刷新页面则计时清0
认为有两个地址在同时登录,超时计时从0开始,所以第一次登录操作页面一直正常。


接下来,超时退出了,再次登录:

登录时拿到的ip:192.168.1.99,由于第一次登录,超时计时清0
登录后页面校验拿到的ip:10.60.0.220,由于之前已经超时,计时没办法清0,计时数字不断变大

所以超时(5分钟)后再次登录成功,但是点选其他界面就会回归login界面

总的来说,要是REMOTE_ADDR = 192.168.1.99”和HTTP_COOKIE中的“domain=10.60.0.220”的值一致,就不会出现这个异常了。




源码我修复不了,就在应用层避免吧,设置如果超时则清空之前记录的cookie,回归到第一次,先理清思路,下次和别人讲解才能流畅一些。

save_cookie():自定义函数,登录时调用此函数,并保存在磁盘中,登陆后的每个操作也都会调用这个函数,以检查cookie是否超时;

函数内的逻辑如下;


/***************************************************************************** Prototype    : save_session Description  : 保存浏览器cookie, cookie时间戳使用uptime              : 所有cookie信息保存内存中 Input        : int *pcSession Output       : None Return Value : static char Calls        :  Called By    : *****************************************************************************/static int save_cookie(struct cookie *cookie){    struct sysinfo info;    FILE *pfdata;    unsigned int len;    unsigned int loop;    unsigned int flag;        info.uptime=0;    sysinfo(&info);    cookie->uitime=info.uptime;        len=sizeof(struct cookie) * COOKIE_NUMS;    memset(cookies, 0, len);    if((pfdata=fopen(COOKIES_PATH, "r+")))    {        fread(cookies, len, 1, pfdata);        fclose(pfdata);    }    /* 查询 */    flag=0;    for(loop=0;loop<COOKIE_NUMS;loop++)    {                     if((0 == strcmp(cookie->aucname, cookies[loop].aucname))            && (0 == strcmp(cookie->aucdomain, cookies[loop].aucdomain)))        {                if((cookie->uitime-cookies[loop].uitime<=cgiTimeouts) || (cookie->flag == COOKIE_SET_FLAG))            {                cookies[loop].uitime=cookie->uitime;                break;            }            else             {                lcgic_log(CGI_LOG_WARN, "the cookie is timeout.");                /* 【新增】超时则清空/tmp/.sessions 文件,使用通过vpn登陆本地web,超时后登陆不上去问题 */                system("echo  > "COOKIES_PATH"");                return SessionTimeoutFailed;            }        }        flag++;    }    if((pfdata=fopen(COOKIES_PATH, "w+")))    {        fwrite(cookies, len, 1, pfdata);        fclose(pfdata);    }        return SessionSuccess;}



以下表格部分是CGI的环境变量,在其他文章看到的,比较有用就摘抄过来了:

CGI环境变量在CGI程序启动时初始化,在结束时销毁。

       当一个CGI程序不是被HTTP服务器调用时,它的环境变量几乎是系统环境变量的复制。

当这个CGI程序被HTTP服务器调用时,它的环境变量就会多了以下关于HTTP服务器、客户端、CGI传输过程等项目。

 

与请求相关的环境变量

REQUEST_METHOD

服务器与CGI程序之间的信息传输方式

QUERY_STRING

采用GET时所传输的信息

CONTENT_LENGTH

STDIO中的有效信息长度

CONTENT_TYPE

指示所传来的信息的MIME类型

CONTENT_FILE

使用Windows HTTPd/WinCGI标准时,用来传送数据的文件名

PATH_INFO

路径信息

PATH_TRANSLATED

CGI程序的完整路径名

SCRIPT_NAME

所调用的CGI程序的名字

与服务器相关的环境变量

GATEWAY_INTERFACE

服务器所实现的CGI版本

SERVER_NAME

服务器的IP或名字

SERVER_PORT

主机的端口号

SERVER_SOFTWARE

调用CGI程序的HTTP服务器的名称和版本号

与客户端相关的环境变量

REMOTE_ADDR

客户机的主机名

REMOTE_HOST

客户机的IP地址

ACCEPT

例出能被次请求接受的应答方式

ACCEPT_ENCODING

列出客户机支持的编码方式

ACCEPT_LANGUAGE

表明客户机可接受语言的ISO代码

AUTORIZATION

表明被证实了的用户

FORM

列出客户机的EMAIL地址

IF_MODIFIED_SINGCE

当用get方式请求并且只有当文档比指定日期更早时才返回数据

PRAGMA

设定将来要用到的服务器代理

REFFERER

指出连接到当前文档的文档的URL

USER_AGENT

客户端浏览器的信息

       

CONTENT_TYPE:application/x-www-form-urlencoded,表示数据来自HTML表单,并且经过了URL编码。

ACCEPT:客户机所支持的MIME类型清单,内容如:”image/gif,image/jpeg”

REQUEST_METHOD:它的值一般包括两种:POSTGET,但我们写CGI程序时,最后还要考虑其他的情况。



关于HTTP_COOKIE比较特殊:

如果你在一台支持COOKIE的客户端设置了COOKIE,当这个客户端在次来访问时,浏览器会向你的CGI所在的WEB服务器发送一条HTTP响应头,这个响应头为: 
Cookie:name1=value;name2=value2;exprires=DATE;PATH=PATH;domiam=DOMAIN_NAME;SECURE 
根据这个HTTP响应头WEB服务器的环境变量 HTTP_COOKIE=:name1=value;name2=value2 
我们对这个环境变量的内容进行分解就可以的到我我们要的信息。 



原创粉丝点击