|
|
|
在CGI中实现session的想法和实现
作者:Webmaster 来源:Linuxdby.com 点击:
日期:2007-04-28
[收藏] [投稿]
IE是否经常中毒?推荐您
|
|
对于客户端的每一次登陆,在服务器生成一个session,作为一个文件存储在服务器上,例如在“/tmp”下。 文件命名为sess_开头,在加上一个随机的字符串,这个字符串称之为session_id。 在文件中存储的内容包括: 1、用户的最后一次活动时间。(用来检查用户是否长时间没有操作,视为已经退出登陆)。 2、一个随机的字符串。(用来验证客户端的身份,这个字符串同时作为cookie发往客户端)。 3、客户端的IP. 4、实际要存储的数据。例如用户的ID,密码等。 在用户登陆时,生成这个文件,并且,将那个随机字符串发到客户端的cookie. 在以后的每个页面的超连接,或是FORM中的要跟入session_id. 每个页面开始,要: 1、检查是否超时。 2、对比cookie中的字符串和session文件中的,验证客户身份。 3、对比客户端IP和session文件中的IP,验证客户身份。 4、读出数据,供下面程序使用 5、刷新最后活动时间 6、生成新的随机字符串,刷新session中对应部分,并将其作为cookie发往客户端。
因为我正在做的项目要求比较高的安全性,所以我在这方面考虑的比较多些,但我知道这样肯定还 不是完全安全的。如果谁发现了什么漏洞,麻烦告诉我。 下面是我的部分实现代码: set_session()在登陆是调用。 start_session()在每个页面的前面调用。 kill_session()在退出登陆是调用。 clean_session() 用来删除过期的session文件。 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <dirent.h> #define REMOTE_ADDR1 getenv("REMOTE_ADDR") #define HTTP_COOKIE getenv("HTTP_COOKIE") char *sess_user_name; char *sess_user_pwd; static void print_session_error(char *); static void clean_session_file(); char *set_session(char *name,char *pwd) { char str_now[11]; char hash_key[17]; char *session_id; time_t now; FILE *sf; char sfp[32]; int i,temp,r; time(&now); /** * clean time out session file */ clean_session_file(); /** * get str_now */ sprintf(str_now,"%10d",now); /** * get random hash_key */ srand(now); r = rand(); for(i=0;i<16;i++) { srand(r); r = rand(); hash_key[i] = r%26 + ’a’; } hash_key[16] = ’\0’; /** * get more random session_id; */ temp = rand(); srand(temp); r = rand(); session_id = (char*) malloc(17*sizeof(char)); for(i=0;i<16; i++) { srand(r); r = rand(); session_id[i] = r%26 + ’A’; } session_id[16] = ’\0’; /** * create session file */ strcpy(sfp,"/tmp"); strcat(sfp,"/sess_"); strcat(sfp,session_id); sf = fopen(sfp,"w"); chmod(sfp,06777); if( sf == NULL ) { tc_error_page("can’t creat session file"); } /** * fputs session file */ fputs(str_now,sf); fputs("\n",sf); fputs(hash_key,sf); fputs("\n",sf); fputs(REMOTE_ADDR1,sf); fputs("\n",sf); fputs(name,sf); //sess_user_name fputs("\n",sf); fputs(pwd,sf); // sess_user_pwd_ fputs("\n",sf); fclose(sf); /** * set cookie */ printf("Set-Cookie:hash_key=%s\n",hash_key); return session_id; }
如果您对本文有任何疑问或者建议,请到讨论区发表您的意见:
>>
论坛入口 <<
上一页12 3 下一页
上一篇:CGI绝对路径和相对路径的简便设置方法 下一篇:获取随机的密码
|
|
|
| 【文章评论】
【收藏本文】
【推荐好友】
【打印本文】
【我要投稿】 【论坛讨论】 |
相关文章: |
| ·CGI教学:CGI常用环境变量 | ·关于CGI读写COOKIE的编程·CGI的安全(二)·CGI的安全(一)·获取随机的密码·在CGI中实现session的想法和实现·CGI绝对路径和相对路径的简便设置方法·使用脚本下载网页·利用Perl开发Internet/Intranet应用之二(·利用Perl开发Internet/Intranet应用之二(
文章评论:(1条) |
|
|
|
|
声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。 |
|
|