在CGI中实现session的想法和实现

对于客户端的每一次登陆,在服务器生成一个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

  1<stdio.h>   
  2#include <stdlib.h>   
  3#include <time.h>   
  4#include <unistd.h>   
  5#include <sys types.h="">   
  6#include <sys stat.h="">   
  7#include <fcntl.h>   
  8#include <dirent.h>   
  9#define REMOTE_ADDR1 getenv("REMOTE_ADDR")   
 10#define HTTP_COOKIE getenv("HTTP_COOKIE")   
 11char *sess_user_name;   
 12char *sess_user_pwd;   
 13static void print_session_error(char *);   
 14static void clean_session_file();   
 15char *set_session(char *name,char *pwd)   
 16{   
 17char str_now[11];   
 18char hash_key[17];   
 19char *session_id;   
 20time_t now;   
 21FILE *sf;   
 22char sfp[32];   
 23int i,temp,r;   
 24time(&amp;now);   
 25/**   
 26* clean time out session file   
 27*/   
 28clean_session_file();   
 29  
 30/**   
 31* get str_now   
 32*/   
 33sprintf(str_now,"%10d",now);   
 34/**   
 35* get random hash_key   
 36*/   
 37srand(now);   
 38r = rand();   
 39for(i=0;i&lt;16;i++)   
 40{   
 41srand(r);   
 42r = rand();   
 43hash_key[i] = r%26 + ’a’;   
 44}   
 45hash_key[16] = ’\0’;   
 46  
 47/**   
 48* get more random session_id;   
 49*/   
 50temp = rand();   
 51srand(temp);   
 52r = rand();   
 53session_id = (char*) malloc(17*sizeof(char));   
 54for(i=0;i&lt;16; i++)   
 55{   
 56srand(r);   
 57r = rand();   
 58session_id[i] = r%26 + ’A’;   
 59}   
 60session_id[16] = ’\0’;   
 61/**   
 62* create session file   
 63*/   
 64strcpy(sfp,"/tmp");   
 65strcat(sfp,"/sess_");   
 66strcat(sfp,session_id);   
 67sf = fopen(sfp,"w");   
 68chmod(sfp,06777);   
 69if( sf == NULL )   
 70{   
 71tc_error_page("can’t creat session file");   
 72}   
 73/**   
 74* fputs session file   
 75*/   
 76fputs(str_now,sf);   
 77fputs("\n",sf);   
 78fputs(hash_key,sf);   
 79fputs("\n",sf);   
 80fputs(REMOTE_ADDR1,sf);   
 81fputs("\n",sf);   
 82fputs(name,sf); //sess_user_name   
 83fputs("\n",sf);   
 84fputs(pwd,sf); // sess_user_pwd_   
 85fputs("\n",sf);   
 86fclose(sf);   
 87/**   
 88* set cookie   
 89*/   
 90printf("Set-Cookie:hash_key=%s\n",hash_key);   
 91  
 92return session_id;   
 93}   
 94void start_session()   
 95{   
 96int i,j,k;   
 97char *session_id;   
 98FILE *sf;   
 99char sfp[32];   
100time_t now;   
101int r;   
102char buffer[256];   
103char temp[64];   
104char str_time[16];   
105char str_hash_key[20];   
106char str_client_ip[20];   
107char *str_array[6];   
108sess_user_name = (char*)malloc(32*sizeof(char));   
109sess_user_pwd = (char*)malloc(32*sizeof(char));   
110  
111str_array[0] = str_time;   
112str_array[1] = str_hash_key;   
113str_array[2] = str_client_ip;   
114str_array[3] = sess_user_name;   
115str_array[4] = sess_user_pwd; 
116
117本新闻共  2  页,当前在第  1  页  1  2</dirent.h></fcntl.h></sys></sys></unistd.h></time.h></stdlib.h></stdio.h>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus