在CGI中实现session的想法和实现void start_session() { int i,j,k; char *session_id; FILE *sf; char sfp[32]; time_t now; int r; char buffer[256]; char temp[64]; char str_time[16]; char str_hash_key[20]; char str_client_ip[20]; char *str_array[6]; sess_user_name = (char*)malloc(32*sizeof(char)); sess_user_pwd = (char*)malloc(32*sizeof(char)); str_array[0] = str_time; str_array[1] = str_hash_key; str_array[2] = str_client_ip; str_array[3] = sess_user_name; str_array[4] = sess_user_pwd; |
| session_id = cgi_val(entries,"session_id"); /** * open session file */ strcpy(sfp,"/tmp"); strcat(sfp,"/sess_"); strcat(sfp,session_id); sf = fopen(sfp,"rb+"); if( sf == NULL ) /** can’t open session file,maybe session has time out **/ { print_session_error("1"); exit(1); } /** * read session var */ bzero(buffer,256); fread(buffer,1,256,sf); for(i=0,j=0,k=0;k<5 && i<strlen(buffer);i++) { if( buffer[i] == ’\n’ ) { temp[j] = ’\0’; strcpy(str_array[k],temp); j = 0; k ++; } else { temp[j++] = buffer[i]; } } /** * check active time */ time(&now); if( now - atoi(str_time) > atoi(parse_config_file("session_live_time")) ) { print_session_error("2"); exit(1); } /** * compare client hash_key to session hash_key */ if( HTTP_COOKIE == "" || strcmp( HTTP_COOKIE+9 , str_hash_key ) != 0 ) { print_session_error("3"); exit(1); } /** * compare client ip to session ip */ if( strcmp( REMOTE_ADDR, str_client_ip ) != 0 ) { print_session_error("4"); exit(1); } /** * refresh session active time */ time(&now); sprintf(str_time,"%10d\n",now); fseek(sf,0,SEEK_SET); fputs(str_time,sf); /** * get new hash_key */ srand(now); r = rand(); for(i=0;i<16;i++) { srand(r); r = rand(); str_hash_key[i] = r % 26 + ’a’; } str_hash_key[16] = ’\n’; str_hash_key[17] = ’\0’; /** * refresh session hash_key */ fseek(sf,11,SEEK_SET); fputs(str_hash_key,sf); fclose(sf); /** * send cookie refresh client hash_key */ printf("Set-Cookie:hash_key=%s",str_hash_key); } 上一篇:CGI绝对路径和相对路径的简便设置方法 下一篇:获取随机的密码 更多相关文章
|
推荐文章
精彩文章
|