Username: Password:

CGI编程的COOKIE技术应用
来源:linux宝库作者:linux宝库 发布时间:2007-09-30 00:00:00


  我们在一些留言本、BBS讨论区发贴时常会出现这种现象:当进入发贴界面时在需要填写用户名和密码的地方就已自动地填上了您的资料。这是什么会事呢?这是因为程式中引入了COOKIE技术的缘故。原来在您第一次登录时,程式就已在您的电脑中安装了一个COOKIE信息包,在您今后登陆时电脑就自动检索您的COOKIE并取出信息包的信息供程式调用,所以出现上面所述的现象。

  COOKIE只但是是CGI程式需要浏览器持有的一个信息包,这个信息包能够由CGI程式在任何时候收回。每当CGI程式需要创建COOKIE 时,COOKIE能够从服务器传送到浏览器所属的子目录下(通常是保存在C:\WINDOWS\Temporary Internet Files的目录下,这个过程称为COOKIE的安装。

  COOKIE的安装和读出通常都由一个CGI模块来完成,下面我就将此模块的原代码公开给大家,有了这个COOKIE模块我们在编写程式时如要应用COOKIE技术能够说易如反掌。

  cookie的语法:

  http cookie的发送是通过http头部来实现的,他早于文档的传递,头部set-cookie的语法如下:

  Set-cookie:name=name;expires=date;path=path;domain=domain;secure name=name: 需要配置cookie的值(name不能使用“;”和","号),有多个name值时用";"分隔例如:name1=name1;name2= name2;name3=name3。

  expires=date: cookie的有效期限,格式: expires="Wdy,DD-Mon-YYYY HH:MM:SS"

  path=path: 配置cookie支持的路径,假如path是个路径,则cookie对这个目录下的任何文档及子目录生效,例如:path="/cgi-bin/",假如path是个文档,则cookie指对这个文档生效,例如:path="/cgi-bin/cookie.cgi"。

  domain=domain: 对cookie生效的域名,例如:domain="gzdzw.51.net"

  secure: 假如给出此标志,表示cookie只能通过SSL协议的https服务器来传递。

  cookie的接收是通过配置环境变量HTTP_COOKIE来实现的,CGI程式能够通过检索该变量获取cookie信息。

  以下是个cookie的模块,能够为您编写程式带来方便

  $Cookie_Exp_Date = ’’;#此处配置cookie的有效时间

  $Cookie_Path = ’’;#此处配置cookie的有效路径,默认脚本存在的目录。

  $Cookie_Domain = ’’; #此处配置cookie的有效域名,默认脚本调用的域名

  $Secure_Cookie = ’0’;

  @Cookie_Encode_Chars = (’\%’, ’\+’, ’\;’, ’\,’, ’\=’, ’\&’, ’\:\:’, ’\s’);

  %Cookie_Encode_Chars = (’\%’, ’%25’,

  ’\+’, ’%2B’,

  ’\;’, ’%3B’,

  ’\,’, ’%2C’,

  ’\=’, ’%3D’,

  ’\&’, ’%26’,

  ’\:\:’, ’%3A%3A’,

  ’\s’, ’+’);# 特别字符的解码

  @Cookie_Decode_Chars = (’\+’, ’\%3A\%3A’, ’\%26’, ’\%3D’, ’\%2C’, ’\%3B’, ’\%2B’, ’\%25’);

  %Cookie_Decode_Chars = (’\+’, ’ ’,

  ’\%3A\%3A’, ’::’,

  ’\%26’, ’&’,

  ’\%3D’, ’=’,

  ’\%2C’, ’,’,

  ’\%3B’, ’;’,

  ’\%2B’, ’+’,

  ’\%25’, ’%’);# 特别字符的解码

  #########获取cookie信息子程式#####################

  sub GetCookies {

  local(@ReturnCookies) = @_;

  local($cookie_flag) = 0;

  local($cookie,$value);

  if ($ENV{’HTTP_COOKIE’}) {

  if ($ReturnCookies[0] ne ’’) {

  foreach (split(/; /,$ENV{’HTTP_COOKIE’})) {#分割HTTP_COOKIE变量的字符串

  ($cookie,$value) = split(/=/);

  foreach $char (@Cookie_Decode_Chars) {

  $cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;#调用转码函数

  $value =~ s/$char/$Cookie_Decode_Chars{$char}/g;#调用转码函数

  }

  foreach $ReturnCookie (@ReturnCookies) {

  if ($ReturnCookie eq $cookie) {

  $Cookies{$cookie} = $value;

  $cookie_flag = "1";

  }

  }

  }

  }

  else {

  foreach (split(/; /,$ENV{’HTTP_COOKIE’})) {

  ($cookie,$value) = split(/=/);

  foreach $char (@Cookie_Decode_Chars) {

  $cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;

  $value =~ s/$char/$Cookie_Decode_Chars{$char}/g;

  }

  $Cookies{$cookie} = $value;

  }

  $cookie_flag = 1;

  }

  }

  return $cookie_flag;

  }

  ########## 配置Cookie信息子程式#######################

  sub SetSecureCookie {

  if ($_[0] =~ /^[01]$/) {

  $Secure_Cookie = $_[0];

  return 1;

  }

  else {

  return 0;

  }

  }

  sub SetCookies {

  local(@cookies) = @_;

  local($cookie,$value,$char);

  while( ($cookie,$value) = @cookies ) {

  foreach $char (@Cookie_Encode_Chars) {

  $cookie =~ s/$char/$Cookie_Encode_Chars{$char}/g;#调用转码函数

  $value =~ s/$char/$Cookie_Encode_Chars{$char}/g;#调用转码函数

  }

  print ’Set-Cookie: ’ . $cookie . ’=’ . $value . ’;’;#配置cookie值

  if ($Cookie_Exp_Date) { print ’ expires=’ . $Cookie_Exp_Date . ’;’; }#配置有效时间

  if ($Cookie_Path) { print ’ path=’ . $Cookie_Path . ’;’; }#配置有效路径

  if ($Cookie_Domain) { print ’ domain=’ . $Cookie_Domain . ’;’; }#配置有效域名

  if ($Secure_Cookie) { print ’ secure’; }

  print "\n";

  shift(@cookies); shift(@cookies);

  }

  }

  sub SetCompressedCookies {

  local($cookie_name,@cookies) = @_;

  local($cookie,$value,$cookie_value);

  while ( ($cookie,$value) = @cookies ) {

  foreach $char (@Cookie_Encode_Chars) {

  $cookie =~ s/$char/$Cookie_Encode_Chars{$char}/g;

  $value =~ s/$char/$Cookie_Encode_Chars{$char}/g;

  }

  if ($cookie_value) { $cookie_value .= ’&’ . $cookie . ’::’ . $value; }

  else { $cookie_value = $cookie . ’::’ . $value; }

  shift(@cookies); shift(@cookies);

  }

  &SetCookies("$cookie_name","$cookie_value");

  }

  sub GetCompressedCookies {

  local($cookie_name,@ReturnCookies) = @_;

  local($cookie_flag) = 0;

  local($ReturnCookie,$cookie,$value);

  if (&GetCookies($cookie_name)) {

  if ($ReturnCookies[0] ne ’’) {

  foreach (split(/&/,$Cookies{$cookie_name})) {

  ($cookie,$value) = split(/::/);

  foreach $char (@Cookie_Decode_Chars) {

  $cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;

  $value =~ s/$char/$Cookie_Decode_Chars{$char}/g;

  }

  foreach $ReturnCookie (@ReturnCookies) {

  if ($ReturnCookie eq $cookie) {

  $Cookies{$cookie} = $value;

  $cookie_flag = 1;

  }

  }

  }

  }

  else {

  foreach (split(/&/,$Cookies{$cookie_name})) {

  ($cookie,$value) = split(/::/);

  foreach $char (@Cookie_Decode_Chars) {

  $cookie =~ s/$char/$Cookie_Decode_Chars{$char}/g;

  $value =~ s/$char/$Cookie_Decode_Chars{$char}/g;

  }

  $Cookies{$cookie} = $value;

  }

  $cookie_flag = 1;

  }

  delete($Cookies{$cookie_name});

  }

  return $cookie_flag;

  }

  ########结束#################

  下面是cookie信息包安装代码段

  

  ###########结束#####################

  下面是读取信息包代码,很简单:

  &GetCookies;

  $name=$Cookies{’username’};

  $pass=$Cookies{’password’};

喜欢本文,那就收藏到:

    Del.icio.us Google书签 Digg Live Bookmark Technorati Furl Yahoo书签 Facebook 百度搜藏 新浪ViVi 365Key网摘 天极网摘 和讯网摘 博拉网 POCO网摘 添加到饭否 QQ书签 Digbuzz我挖网
相关评论  我也要评论
还没有关于此文章的相关评论!
  • 昵称: (为空则显示guest)
  • 评论分数: ★ ★ ★★★ ★★★★ ★★★★★
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
  • 导航
    赞助商
    文章类别
    订阅