中国站长下载-为中国站长提供最好最全的建站资源! 首 页发布资源有事留言繁體中文
设为首页
加入收藏
联系我们
 
您当前的位置:中国站长下载 -> 文章中心 -> 网页编程 -> CGI 专区 -> 文章内容  虚拟主机 域名注册 退出登录 用户管理
栏目导航
· ASP编程 · .NET编程
· PHP编程 · JSP编程
· CGI 专区
热门文章
· sndvol32 - sndvol3...
· [组图] FLASH:《大话李白》...
· 个人网站到底能赚多...
· [图文] Rundll.exe是病毒吗...
· [组图] Flash:制作MV
· 价值12万元的网站SE...
· 网站创业者,你需要...
· 一个成功的网站设计...
· [图文] FLASH:韩国导航条解...
· 中国网站的赚钱模式...
相关文章
在CGI中实现session的想法和实现
作者:无从考证  来源:CSDN  发布时间:2005-9-15 11:25:25  发布人:chinazhan

 减小字体 增大字体

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

[1] [2]  下一页

 
[] [返回上一页] [打 印] [收 藏]
上一篇文章:获取随机的密码
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论...]
中国站长下载
中国站长下载

本页只接受PR>=4 IT类站点连接,申请连接,谢谢您们的支持!希望我们的下载站能够真正帮到中国的站长们!
关于本站 - 网站帮助 - 广告合作 - 下载声明 - 友情连接 - 网站地图
Copyright © 2005-2006 ChinaZhan.Net. All Rights Reserved .