在CGI中实现session的想法和实现(ltesting.net)

nginx使用301过滤黑客攻击 nginx使用301过滤黑客攻击nginx使用301过滤黑客攻击奇怪的访问被攻击内容开始防御日志的改进成果结论 nginx使用301过滤黑客攻击 2020/5/9随便翻看了一下公司网站的访问日志,发现有不少来自国外的攻击。 公司的网站只是用来宣传的,从搭建到设计都是我一个人做的,没有做得很华丽,也没有特别多的功能。 奇怪的访问 因为调度gzip压缩功能,所以看了一下日志。发现里面有不少404和400,截取一部分如下 77.247.108.77 - - [09/May/2020:11:51:30 +0900] 阅读详情

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

 

   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); 

}

void kill_session()

{

  char *session_id;

  char *session_path;

  char sfp[128];

  session_id   = cgi_val(entries,"session_id");

  strcpy(sfp,"/tmp");

  strcat(sfp,"/sess_");

  strcat(sfp,session_id);

  remove(sfp);

}

void clean_session_file()

{

  DIR *pdir;

  struct dirent *ent;

  char *path;

  char *filename;

  char filepath[64];

  int fd;

  char str_time[11];

  time_t  now;

  path = "/tmp";

  pdir = opendir(path);

  if(pdir != NULL)

  {

    while( ent =readdir(pdir) )

    {

       filename = ent->d_name;

       if( strncmp(filename,"sess_",5)==0 )

       {

          strcpy(filepath,path);

          strcat(filepath,"/");

          strcat(filepath,filename);

          fd = open(filepath,O_RDONLY);

          read(fd,str_time,10);

          time(&now);

          if( now - atoi(str_time) > atoi(parse_config_file("session_live_time")) )

          {

            remove(filepath);

          }

          close(fd);

       }

    }

  }

  closedir(pdir);

}

void print_session_error(char *n)

{

   printf("Content-type:text/html\n\n");

   printf("<html><head>";

   print_title("请重新登陆!");

   printf("</head>\n");

   printf("<body>\n");

   printf("对不起,请重新登陆。<p>\n");

   printf("你长时间没有操作,登陆已经超时。或者是系统发生了错误。<p>\n");

   printf("如果是后者,请与管理人员联系。\n");

   printf("<!--%s-->",n);

   printf("</body>");

   printf("</html>\n");

}

                                                                                                                                                                                                        ——领测国际
19.7:Python的HTTP编程中如何进行Session管理? 本文通过简单易懂、实用性强的方式,帮助读者掌握Python的HTTP会话管理技术。无论是初学者还是高级开发人员,本文都提供了有用的知识和实用的技能,让我们可以更加轻松地开发Web应用程序。我们希望读者通过本文的学习,能够更加深入地理解HTTP会话管理的重要性,并掌握使用Requests库进行HTTP会话管理的基本方法。 阅读详情

相关推荐

YOLOv8环境搭建+训练自己的数据详细项目

直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\requirements.txt。首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口。到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt。然后安装ultralytics ,这是必须的。

m0_63172128的博客 2万+

python cgi 实现用户会话[zt]

python cgi 实现用户会话http://blog.chinaunix.net/u1/46577/showart_389423.html 众所周知,http协议是无状态的,也就是说客户端每次连接到服务器时,都是一个全新的状态,上一次访问服务器的状态无法在当次访问中维持,在B/S应用 开发中,通常使用Cookie保存客户端状态,Cookies最典型的应用是判定注册用户是否...

weixin_34319111的博客 340

Rapid SCADA MQTT

一、配置RapidSCADA 1、准备KpMqtt.dll、Jint.dll库文件,从网盘下载。 2、将以上两个文件拷贝到SCADA安装目录的Comm/KP目录下,如下: C:\SCADA\ScadaComm\KP 3、新建SCADA项目 4、新建Line 5、新建Device 6、拷贝Config目录下的KpMqtt_001.xml文件、KpMqtt_Job.js文件到项目Comm\Config下,如下示例链接 C:\SCADA\Projects\MQTTProject\Instances\Defau

mumanquan1的博客 3007

Python CGI初体验

CGI小述 CGI(Common Gateway Interface,通用网页接口)。CGI是网络服务器可以将查询(一般来说是通过Web表单)传递到专门的程序(比如Python等)中并且在网页上显示结果的标准机制。它是创建万维网应用程序而不用编写特殊用途的应用服务器的简单方法。 CGI(Common Gateway Interface) 是WWW技术中最重要的...

weixin_30625691的博客 227

深入理解「二进制掩码」:从原理到实践

二进制掩码本质上是一个二进制数,用于通过位操作(如与、或、非、异或等)选择性地操作目标数据的某些位。掩码的每一位(bit)可以看作一个“开关”,决定是否对目标数据的对应位进行操作。二进制掩码是位操作的灵魂,掌握它不仅能提升代码效率,还能解锁许多高级编程技巧。从基础的位提取到复杂的子集枚举,掩码的应用无处不在。希望本文的讲解和代码示例能帮助你快速上手,并在实际项目中灵活运用。如果你有更多关于掩码的疑问或应用场景,欢迎在评论区留言交流!

m0_73494933的博客 2433

【Qt】使用QMediaPlayer播放视频

window平台可以安装K-Lite,linux平台一般各发行版都会默认安装GSteam。播放RTSP视频时,可以使用VLC播放器搭建一个视频推流服务器,用于拉流的客户端的调试。3、如果没有添加Qt环境变量,请把关联的Qt5MultimediaWidgets.dll和Qt5Multimedia.dll放到进程路径下否则也会报ServiceMissingError错误。2、需要安装解码器,否则报 ServiceMissingError 无法找到服务的错误。1、需要在.pro工程文件中引用对应模块。

奔涌的后浪的专栏 2220

35.从入门到精通:Python CGI编程 什么是CGI 网页浏览 CGI架构图 Web服务器支持及配置 第一个CGI程序 HTTP头部

CGI是一种通用网关接口,它是一种标准的协议,用于在Web服务器上运行外部程序(通常是脚本程序)。CGI程序可以在Web服务器上生成动态内容,例如网页表单的处理、数据库查询和图像生成。CGI程序可以用多种编程语言编写,例如Python、Perl、C++等。在Python中,CGI编程可以使用内置的CGI模块来实现。这个模块提供了一些函数,可以方便地处理CGI请求和响应。

weixin_63740705的博客 5293

一文详解心电图(ECG)监测原理

介绍心电图的监测原理,从心电信号产生、获取到心电图的基本组成

m0_50146396的博客 3290

c语言cgi session,CGI::Session CGISESSID Cookie值目录遍历漏洞

BUGTRAQ ID: 30267CGI::Session是一个Perl5库,可提供可靠易用的模块化会话管理系统。CGI::Session没有充分的过滤CGISESSID cookie值便将其用在了File驱动中创建会话数据文件的文件名。如果远程攻击者在cookie值中注入了目录遍历序列,就会导致File驱动从配置的会话数据目录以外的任意文件读取会话数据。仅在满足了所有以下条件的情况下才可以利用...

weixin_39871562的博客 308

汽车LIN总线(3) -- 协议层:帧的类型

主要介绍LIN协议层中帧的类型,介绍中加入一点自己的理解(带下划线的是,其余是官方资料)。

晴朗luo的博客 889

海思图像质量之HiPQTool调试

文章目录一. HiPQTool 界面二. 图像调试三. 将调试参数写入程序中 一. HiPQTool 界面 二. 图像调试 三. 将调试参数写入程序中

lzg2011的博客 2382

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

   对于客户端的每一次登陆,在服务器生成一个session,作为一个文件存储在服务器上,例如在“/tmp”下。文件命名为sess_开头,在加上一个随机的字符串,这个字符串称之为session_id。   在文件中存储的内容包括:   1、用户的最后一次活动时间。(用来检查用户是否长时间没有操作,视为已经退出登陆)。   2、一个随机的字符串。(用来验证客户端的身份,这个字符串同时作为cookie

dgj的专栏 1388

第1章 环境准备

本章是 Kubernetes 高可用集群部署的前置基础环境配置,所有节点必须严格按顺序执行。主要内容包括:节点规划(IP、角色、配置要求)、VMware 克隆节点环境清理(解决 MAC 地址和主机名冲突)、统一工作目录创建、主机名与 hosts 解析配置、系统基础升级、防火墙与 swap 关闭、内核模块加载(overlay、br_netfilter、ip_vs)、网络参数优化(IP 转发、桥接过滤)、时间同步配置等。Ubuntu 24.04 内核 6.8+ 原生支持 eBPF 和 IPVS,无需手动升级内核

幸福街--linux技术分享 210

c语言cgi session,在CGI中实现session的想法和实现

#include#defineREMOTE_ADDR1getenv("REMOTE_ADDR")#defineHTTP_COOKIEgetenv("HTTP_COOKIE")char*sess_user_name;char*sess_user_pwd;staticvoidprint_session_error(char*);staticvoidclean_session_f...

weixin_28760171的博客 674

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Webmin未经身份验证的远程代码执行-墨者学院

漏洞描述 Webmin是目前功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。据统计,互联网上大约有13w台机器使用Webmin。当用户开启Webmin密码重置功能后,攻击者可以通过发送POST请求在目标系统中执行任意命令,且无需身份验证。 漏洞介绍(cve-2019-15107) 1.漏洞编号: cve-2019-15107 2.漏洞描述: 该漏洞允许恶意第三方在缺少输入验证的情况下而执行恶意代码,该漏洞由于password_change.c

小白鸽 733

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

用c编写CGI,如何实现用户登录的session问题

我的web程序是     html+c语言cgi+boa服务器,以后要放到嵌入式板子里面     但是用户登录的session怎么处理?     javascript没有办法吧?     那只好通过c了,但是c怎么处理呢?     谢谢!  Session需要自己写,参考一下php的Session,它可以用文件存储,不用缓存在内存中         例如定义C的Session格式为:CGI

GerryZhu的专栏 9447

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

session 的cgi 简单实现

http://blog.csdn.net/wybing/archive/2004/12/29/233621.aspx

fanlix的专栏 1533

Ruby学习之CGI里session的定义和使用

CGI::Session 可以为用户和CGI环境保存持久的会话状态,会话使用后需要关闭,这样可以保证数据写入到存储当中,当会话完成后,我们需要删除该数据,来看实例: #!/usr/bin/ruby require 'cgi' require 'cgi/session' cgi = CGI.new("html4") sess = CGI::Session.new( cgi, "sessi...

luyaran的博客 647

解决perl找不到CGI Session问题

本人最近在用perl基于Rackmonkey开源代码开发网站,需要引用CGI::Session,在use  CGI::Session报错。 首先给出解决问题的办法: 执行 sudo apt-get install libcgi-session-perl 命令安装session,然后问题就被解决了。 本人使用环境简介: Ubuntu 16.04 server + apache2 本人

LIHENHAO的专栏 1655
上一篇: How to Lead a Happier and Successful Test Team – Test Leadership Part 2
下一篇: 请教,对数据仓库等数据类测试,有什么心得可以指点一下吗?谢谢(51Testing)
marysa
博客等级 码龄19年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值