[Hack]重归CGI.pm怀抱的LBCGI.pm

即LBCGI不再是CGI.pm的mini,而是继承于CGI.pm的模块。
目的 :
1。解决在部分主机上的兼容问题。
2。稳定性加强,尤其是在上传的时候。
3。资源问题在3台不同类型主机上测试,在FreeBSD下cpu时间提升了10ms左右,WIndows基本不变

相关信息 :
 http://www.leohacks.com/cgi-bin/topic.cgi?forum=3&topic=3420

成品 ://static.easunlee.cn/upload/early/_1118419837.rar

相关修改。
1。已知cookieDate问题修正。
就是选用这个LBCGI.pm后选择不保存密码登陆将会登陆失败。可以搜索所有的leobbsx文件,把 -1d 替换成 0,即可。
原因,CGI.pm和原来LBCGI.pm定义不同。

2。 upfile.cgi。
由于弃用几个很古老的函数,所以上传做了变动。 具体修改sub doupfile前面部分为

代码:



sub doupfile #上传
{
 # $addme=$query->upload('addme'); #如果CGI.pm版本>2.47,推荐使用
 $addme=$query->param('addme'); #如果CGI.pm版本<2.47,用他替换上句
 $forum=$query->param('forum');
 $topic=$query->param('topic');
 $inforum       = $forum;
 $intopic       = $topic;

 &moderator($inforum); #获得权限

 my $thispath=&getusrdir; #临时目录

 &thisout("<b>目前您未被发布的附件临时文件已经有$filesno个,达到了论坛设置的最大数目($ maxaddnum),<BR>请不要一次上传太多附件,谢谢配合与合作!</b>$gourl") if ($thispath eq 'ERR');

 if (($addme)&&(($arrowupload ne 'off')||($membercode eq 'ad')||($membercode eq 'smo')||($inmembmod eq 'yes'))) {
          $uploadreqire = 0 if ($uploadreqire < 0);
          if (($membercode ne 'ad')&&($membercode ne 'smo')&&($membercode ne 'amo')&&($membercode ne 'cmo')&&($membercode ne 'mo')&&($membercode !~ /^rz/)&&($inmembmod ne 'yes')&&(($numberofposts+$numberofreplys) < $uploadreqire)) {
              &thisout("上传出错,你必须发帖总数达到 <B>$uploadreqire</B> 才能在本区上传!$gourl");
          }


         my ($tmpfilename) = $addme =~ m|([^/:\\]+)$|; #注意,获取文件名字的形式变化
   #     $tmpfilename =~s/([^\w.-])/_/g;
   #     $tmpfilename =~s/(^[-.]+)//;
         my @filename = split(/\./,$tmpfilename); #注意
         $up_name = $filenameΎ];
         $up_ext = $filename[-1];
         $up_ext = lc($up_ext);

          my $checkadd=0;
          for (split(/\,\s*/,$addtype)){
              $checkadd=1,last if ($up_ext eq lc($_));
          }
          &thisout("上传出错,为了安全,不支持你所上传的附件,请重新选择!$gourl") if ($up_ext eq "exe"||$up_ext eq "com"||$up_ext eq "pl"||$up_ext eq "cgi"||$up_ext eq "asp"||$up_ext eq "php"||$up_ext eq "php3"||$up_ext eq "phtml"||$up_ext eq "jsp"||$up_ext eq "cfml"||$up_ext eq "dll");
          &thisout("上传出错,不支持你所上传的附件或者图片,请重新选择!$gourl") if ($checkadd==0);
          my $filesize=0;
          my $bufferall;

          my $tmpfilename=&gettmpname(${up_name}); #注意
           open (FILE,">$thispath/$tmpfilename.$up_ext");
          binmode ($addme); #注意
          binmode (FILE);
          while (((read($addme,$buffer,4096)))&&!(($filesize>$maxupload)&&($membercode ne "ad"))) {
              if ($up_ext eq "txt"||$up_ext eq "cgi"||$up_ext eq "pl"||$up_ext eq "php3"||$up_ext eq "phtm"||$up_ext eq "phtml"||$up_ext eq "htm"||$up_ext eq "html"||$up_ext eq "asp"||$up_ext eq "php"||$up_ext eq "shtml"||$up_ext eq "phtml"||$up_ext eq "jsp"){
                  $buffer=~s/\.cookie/\&\#46\;cookie/isg;
                  $buffer =~ s/on(mouse|exit|error|click|key)/\&\#111\;n$1/isg;
                  $buffer=~s/script/scri\&\#112\;t/isg;
                  $buffer =~ s/style/\&\#115\;tyle/isg;
              }
              print FILE $buffer;
              $bufferall .= $buffer if ($up_ext eq 'torrent');
              $filesize=$filesize+4;
          }
          close (FILE);
         close ($addme); #注意


      #############torrent分析################


3。 dosavemodify.pl

也是修改上传部分。

修改

   if ($addme) {
           unlink ("${imagesdir}usravatars/$memberfiletitle.gif");
           unlink ("${imagesdir}usravatars/$memberfiletitle.png");
           unlink ("${imagesdir}usravatars/$memberfiletitle.jpg");
           unlink ("${imagesdir}usravatars/$memberfiletitle.swf");
           unlink ("${imagesdir}usravatars/$memberfiletitle.bmp");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.gif");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.png");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.jpg");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.swf");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.bmp");

       my $filename =$query->uploadInfo($addme);
       my $fileexp;
       $fileexp = ($filename =~ /\.jpe?g\s*$/i) ? 'jpg'
                 :($filename =~ /\.gif\s*$/i)  ? 'gif'
                 :($filename =~ /\.png\s*$/i)  ? 'png'
                 :($filename =~ /\.swf\s*$/i)  ? 'swf'
                 :($filename =~ /\.bmp\s*$/i)  ? 'bmp'
                 :undef;
       $maxuploadava = 200 if (($maxuploadava eq "")||($maxuploadava < 1));
       if (($fileexp eq "swf")&&($flashavatar ne "yes")) {
           &error("不支持你所上传的图片,请重新选择!&仅支持 GIF,JPG,PNG,BMP 类型!");
       }

       if (!defined $fileexp) {
           &error("不支持你所上传的图片,请重新选择!&仅支持 GIF,JPG,PNG,BMP,SWF 类型!");
       }

       my $filesize=0;
       my $buffer;
        open (FILE,">${imagesdir}usravatars/$memberfiletitletemp.$fileexp");
       binmode (FILE);
       while ((($buffer=$query->readUploadFile($addme,4096)))&&!($filesize>$maxuploadava)) {
               print FILE $buffer;
               $filesize=$filesize+4;
       }
        close (FILE);




   if ($addme) {
           unlink ("${imagesdir}usravatars/$memberfiletitle.gif");
           unlink ("${imagesdir}usravatars/$memberfiletitle.png");
           unlink ("${imagesdir}usravatars/$memberfiletitle.jpg");
           unlink ("${imagesdir}usravatars/$memberfiletitle.swf");
           unlink ("${imagesdir}usravatars/$memberfiletitle.bmp");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.gif");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.png");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.jpg");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.swf");
           unlink ("${imagesdir}usravatars/$memberfiletitletemp.bmp");


         my ($filename) = $addme =~ m|([^/:\\]+)$|; #注意,获取文件名字的形式变化

         my @filename = split(/\./,$filename); #注意
         my $up_name = $filenameΎ];
         $fileexp = $filename[-1];
         $fileexp = lc($fileexp);


       $fileexp = ($fileexp =~ /jpe?g$/i) ? 'jpg'
                 :($fileexp =~ /gif$/i)  ? 'gif'
                 :($fileexp =~ /png$/i)  ? 'png'
                 :($fileexp =~ /swf$/i)  ? 'swf'
                 :($fileexp =~ /bmp$/i)  ? 'bmp'
                 :undef;
       $maxuploadava = 200 if (($maxuploadava eq "")||($maxuploadava < 1));
       if (($fileexp eq "swf")&&($flashavatar ne "yes")) {
           &error("不支持你所上传的图片,请重新选择!&仅支持 GIF,JPG,PNG,BMP 类型!");
       }

       if (!defined $fileexp) {
           &error("不支持你所上传的图片,请重新选择!&仅支持 GIF,JPG,PNG,BMP,SWF 类型!");
       }

       my $filesize=0;
       my $buffer;
       open (FILE,">${imagesdir}usravatars/$memberfiletitletemp.$fileexp");
       binmode (FILE);
       while (((read($addme,$buffer,4096)))&&!(($filesize>$maxupload)&&($membercode ne "ad"))) {
              print FILE $buffer;
              $filesize=$filesize+4;
        }
       close (FILE);
       close ($addme); #注意




4。setforums.cgi
也是修改上传。

找到

       $addme=$query->param('addme');
       if ($addme ne ""){
           my $up_filename =$query->uploadInfo($addme);
           my ($up_name,$up_ext) = split(/\./,$up_filename);
           $up_ext = lc($up_ext);
          &errorout("上传出错!不支持您所上传的图片类型,请重新选择!") if (($up_ext ne "gif") && ($up_ext ne "jpg") && ($up_ext ne "bmp")&&($up_ext ne "swf")&&($up_ext ne "png"));
          my $buffer;
            open (FILE,">$imagesdir/myimages/$up_name.$up_ext");
               binmode (FILE);
               while ($buffer=$query->readUploadFile($addme,4096)) {
               print FILE $buffer;
           }
           close (FILE);
       if ($up_ext eq "gif"||$up_ext eq "jpg"||$up_ext eq "bmp"||$up_ext eq "jpeg"||$up_ext eq "png"||$up_ext eq "ppm"||$up_ext eq "svg"||$up_ext eq "xbm"||$up_ext eq "xpm") {
               my $info = image_info("${imagesdir}myimages/$up_name.$up_ext");
           if ($info->{error} eq "Unrecognized file format"){
               unlink ("${imagesdir}myimages/$up_name.$up_ext");
               &errorout("上传出错&上传文件不是图片文件,请上传标准的图片文件!");
           }
           undef $info;
      }
       }

共三处,全部替换成

&douppics();


在 setforums.cgi 结尾处加上


#处理后台上传logo,By Easunlee
sub douppics
{ #1
 # $addme=$query->upload('addme'); #如果CGI.pm版本>2.47,推荐使用
 $addme=$query->param('addme'); #如果CGI.pm版本<2.47,用他替换上句
 return unless ($addme);

 my ($tmpfilename) = $addme =~ m|([^/:\\]+)$|; #注意,获取文件名字的形式变化
 my @filename = split(/\./,$tmpfilename); #注意
 my $up_name = $filenameΎ];
 my $up_ext = $filename[-1];
 $up_ext = lc($up_ext);

 &errorout("上传出错!不支持您所上传的图片类型,请重新选择!") if (($up_ext ne "gif") && ($up_ext ne "jpg") && ($up_ext ne "bmp")&&($up_ext ne "swf")&&($up_ext ne "png"));


 my $buffer;
 open (FILE,">$imagesdir/myimages/$up_name.$up_ext");
 binmode (FILE);
 binmode ($addme); #注意

 while (read($addme,$buffer,4096) )
 {#2
  print FILE $buffer;
  $filesize=$filesize+4;
 } #2
 close (FILE);
 close ($addme); #注意

 if ($up_ext eq "gif"||$up_ext eq "jpg"||$up_ext eq "bmp"||$up_ext eq "jpeg"||$up_ext eq "png"||$up_ext eq "ppm"||$up_ext eq "svg"||$up_ext eq "xbm"||$up_ext eq "xpm")
 { #3

    my $info = image_info("${imagesdir}myimages/$up_name.$up_ext");
    if ($info->{error} eq "Unrecognized file format")
    {
       unlink ("${imagesdir}myimages/$up_name.$up_ext");
       &errorout("上传出错&上传文件不是图片文件,请上传标准的图片文件!");
    }
    undef $info;
 } #3

} #1




5. messanger.cgi
也是上传修改
找到

       $addme = $query->param("addme");
       my $attach = '';
       if ($addme && $allowmsgattachment ne 'no')
       {
               my $up_filename = $query->uploadInfo($addme);
               $up_filename =~ s/\\/\//sg;
               $up_filename = (split(/\//, $up_filename))[-1];
               my @up_names = split(/\./, $up_filename);
               $up_ext = lc(pop(@up_names));

               my $checkadd = 0;
               foreach (split(/\,\s*/, $addtype))
               {
                       $checkadd = 1, last if ($up_ext eq lc($_));
               }
               &error("上传出错&不支持你所上传的附件类型($up_ext),请重新选择!&msg") if ($checkadd == 0);
               my $filesize = 0;
               my $bufferall = '';

               while ((my $buffer = $query->readUploadFile($addme, 4096)) && $filesize < 60)
               {
                       if ($up_ext eq "txt" || $up_ext eq "htm" || $up_ext eq "html" || $up_ext eq "shtml")
                       {
                               $buffer =~ s/\.cookie/\&\#46\;cookie/isg;
                               $buffer =~ s/on(mouse|exit|error|click|key)/\&\#111\;n$1/isg;
                               $buffer =~ s/script/scri\&\#112\;t/isg;
                               $buffer =~ s/style/\&\#115\;tyle/isg;
                       }
                       $bufferall .= $buffer;
                       $filesize += 4;
               }
               &error("上传出错&上传附件大小超过 60 KB,请重新选择!&msg") if (length($bufferall) > 60 * 1024);

               if ($up_ext eq "gif" || $up_ext eq "jpg" || $up_ext eq "bmp" || $up_ext eq "jpeg" || $up_ext eq "png" || $up_ext eq "ppm" || $up_ext eq "svg" || $up_ext eq "xbm" || $up_ext eq "xpm")
               {
                       eval("use Image::Info qw(image_info);");
                       if ($@ eq "")
                       {
                               my $info = image_info(\$bufferall);
                               &error("上传出错&上传附件不是图片文件,请上传标准的图片文件!&msg") if ($info->{error} eq "Unrecognized file format");
                       }
               }
               $attach = "$up_filename*#!&*" . &Base64encode($bufferall);
       }


改成

   # $addme=$query->upload('addme'); #如果CGI.pm版本>2.47,推荐使用
   $addme=$query->param('addme'); #如果CGI.pm版本<2.47,用他替换上句

       my $attach = '';
       if ($addme && $allowmsgattachment ne 'no')
       {

              my ($up_filename) = $addme =~ m|([^/:\\]+)$|; #注意,获取文件名字的形式变化
              my @up_names = split(/\./,$up_filename); #注意
              my $up_name = $up_namesΎ];
              my $up_ext = $up_names[-1];
              $up_ext = lc($up_ext);


               my $checkadd = 0;
               foreach (split(/\,\s*/, $addtype))
               {
                       $checkadd = 1, last if ($up_ext eq lc($_));
               }
               &error("上传出错&不支持你所上传的附件类型($up_ext),请重新选择!&msg") if ($checkadd == 0);
               my $filesize = 0;
               my $bufferall = '';


                binmode ($addme); #注意

                while (read($addme,$buffer,4096) )
                {#2
                  if ($up_ext eq "txt" || $up_ext eq "htm" || $up_ext eq "html" || $up_ext eq "shtml")
                  {
                      $buffer =~ s/\.cookie/\&\#46\;cookie/isg;
                      $buffer =~ s/on(mouse|exit|error|click|key)/\&\#111\;n$1/isg;
                      $buffer =~ s/script/scri\&\#112\;t/isg;
                      $buffer =~ s/style/\&\#115\;tyle/isg;
                  }
                 $bufferall .= $buffer;
                 $filesize += 4;
                 } #2

                close ($addme); #注意

               &error("上传出错&上传附件大小超过 60 KB,请重新选择!&msg") if (length($bufferall) > 60 * 1024);

               if ($up_ext eq "gif" || $up_ext eq "jpg" || $up_ext eq "bmp" || $up_ext eq "jpeg" || $up_ext eq "png" || $up_ext eq "ppm" || $up_ext eq "svg" || $up_ext eq "xbm" || $up_ext eq "xpm")
               {
                       eval("use Image::Info qw(image_info);");
                       if ($@ eq "")
                       {
                               my $info = image_info(\$bufferall);
                               &error("上传出错&上传附件不是图片文件,请上传标准的图片文件!&msg") if ($info->{error} eq "Unrecognized file format");
                       }
               }
               $attach = "$up_filename*#!&*" . &Base64encode($bufferall);
       }


其他已知问题。

1。Q:为什么用了这个后网站出现500 err?
  A:你的网站CGI.pm太低,下载最新的CGI模块包,解压到你的LB目录就可以了(当然,如果你有服务器管理权限,可以直接升级整个服务器的CGI模块)


建议:
如果你能保证你的网站CGI.pm版本>2.47,推荐使用 $addme=$query->upload('addme'); 代替 $addme=$query->param('addme'); 来获取对use strict; 的支持。这里包括profile.cgi的一处修改:)

说明 :
1.仅供Hacks研究使用,免责版本:) 请先备份旧文件。 -_-bbb