即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
成品 :http://easun.org/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
哪天在我的机器上也试试哇。。。。
你现在就可以测试。
运行速度要慢点,但是会相对比较稳定的。
添加完整修改包和修改方法。 http://easun.org/upload/early/_1118419913.rar