Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->编程语言 ->CGI ->正文

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

来源:Linuxdby.com 作者:Webmaster 时间:2007-04-28 点击: [收藏] [投稿]

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绝对路径和相对路径的简便设置方法   下一篇:获取随机的密码

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号