简单留言本原程序分析 2006-05-09 16:07

字号:    
[这个贴子最后由ycxing在 2002/12/06 12:45pm 编辑]

这是我早些时候写的。

这里只是一个非常普通,非常简陋的留言本程序。原作者我忘了,反正是抄袭的,不过改了几点小问题。
原代码及解释如下:



代码:
#!/usr/bin/perl -w  
#这是服务器的perl解释器路径,加w参数是为了本来是为了运行程序的错误的时候有所警告,不过本人发现
#如果你的程序在Win系统下能够运行,而不能在Unix不能运行时,加个w参数可以帮你解决这个烦恼。
$url="http://localhost/cgi-bin/book/index.cgi";
#本程序的url地址
$passwd="123456";
#本程序所设定的密码
$pageview="10";  
#本程序所设定一页能够查看多少留言数
$title="瑞欣供求信息";
#这几个变量是定义参数,就像我们用键盘的时候,必须先定义:按A健就可以在屏幕上显示A。
if ($ENV{'REQUEST_METHOD'} eq "POST")
#判断程序通过Internet的传输方式,是get还是post
#如果传输方式是post,则运行read语句
{
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
#读取post请求中向标准输入<stdin>发送的字节数
}
#如果传输方式不是post,则运行else语句
else
{
$buffer = $ENV{'QUERY_STRING'};
#传递给CGI程序的url的问号(?)之后的那部分
}
# @pairs是一个数组,split函数用于从列表中分离字符串
@pairs = split(/&/, $buffer);    
# foreach是一个条件语句,用来累加一个数组变量的值  
foreach $pair (@pairs)            
{
($comment, $value) = split(/=/, $pair);  

#下面对用户输入进行必要的过滤,如第一行,将用户输入的+号过滤掉为空格
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$value =~ s/\|//g;
$value =~ s/>/&gt;/g;
$value =~ s/</&lt;/g;
$in{$comment} = $value;
}
#总的来说,从上面的if到这里为止,是辨认传输方式和读取拥护请求,然后解码                                                                        
#定义变量                                                                            
$action = $in{'action'};
$key = $in{'key'};
$fangshi = $in{'fangshi'};
$comment = $in{'comment'};
$page = $in{'page'};
$id=$in{'id'};

#for条件语句
for($i=0;$i<$pageview;$i++)  
{
$reply[$i]=$in{$i};
}


if($action eq "add") #判断动作行为
{
&add;#调用add子程序
exit;
}
# 添加子程序add
sub add
{

if(($fangshi eq "") || ($comment eq "")) #检查用户输入是否为空
{
    &message("非法操作,请填写完整!");#调用message子程序
    print "2秒后自动返回....";
    print "<META HTTP-EQUIV='Refresh' Content=' 2\;URL=$url'>";
    exit;
}

#定义时间变量
$ltime=localtime(time);
($day,$month,$dayofmonth,$time,$year,$date3)=split(/\s+/,$ltime);
$mon=$mon+1;
@date4=("星期日","星期一","星期二","星期三","星期四","星期五","星期六");
$day=sprintf("%04d年%02d月",$year,$mon);
($dayofmonth="0".$dayofmonth) if ($dayofmonth<10);
$date=join("-",$year,$month,$dayofmonth);
#join表示的是连接符号,"-"则用-来连接年-月-日等
$date=$date." ".$time." ".$date4[$date3]." "."IP:".$ENV{'REMOTE_ADDR'};


#变量过滤
$comment=~s/  / /g;
$comment=~s/\n/<br>/g;

$templine=join("\|",$fangshi,$comment,$date);

#打开guestbook.dat文件
open (FILE,">>guestbook.dat");
print FILE "$templine\n";
#关闭文件
close (FILE);

&view;#调用view子程序
exit;
}


if($action eq "view")
{
&view;#调用view子程序
exit;
}
# 添加子程序view
sub view
{

if (-e "guestbook.dat")
#-e参数表示正在检查文件guestbook.dat是否存在
{
open (FILE,"guestbook.dat");
@lines=<FILE>;
close (FILE);
$counter=@lines;
@lines=reverse(@lines);

if( $pageview*($page-1)>=$counter)
{
    if(@lines==0)
    {
open (FILE,">guestbook.dat");
print FILE "供|我公司常年供应缸套系列产品<br>|2002-Jun-20 15:32:11 星期日 IP:169.254.116.155\n";
close (FILE);
&view;#调用view子程序
exit;
    }
    &message("非法操作,指定页不存在!");
    print "2秒后自动返回....";
    print "<META HTTP-EQUIV='Refresh' Content=' 2\;URL=$url'>";
    exit;
}
#定义变量
$page=1 if ($page eq "");

$left=$counter%$pageview;
$pages=($counter-$left)/$pageview;
($pages++) if ($left!=0);

#条件语句if
if($page == $pages)
{
    $begin=$pageview*($page-1);
    $end=$begin+$left-1;
    $end=$begin+$pageview-1 if ($left==0);
}
else
{
    $begin=$pageview*($page-1);
    $end=$begin+$pageview-1;
}
}
else
{
open (FILE,">guestbook.dat");
print FILE "供|我公司常年供应缸套系列产品<br>|2002-Jun-20 15:32:11 星期日 IP:169.254.116.155 \n";
close (FILE);
&view;#调用view子程序
exit;
}

#以下都是很容易的,输出html代码,就是html代码
print "Content-type: text/html\n\n";
print '<html>
<head>';
print "<title>$title</title>";
print '<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
.char {  font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
td,form,p{  font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
A:link {COLOR: blue; TEXT-DECORATION: none}
A:visited {COLOR:blue;TEXT-DECORATION: none}
A:active {COLOR:red;TEXT-DECORATION: none}
A:hover {COLOR: black; TEXT-DECORATION: underline}
</style>
</head>';

print "<body bgcolor=#ffffff topmargin=0>";
print "      <p> </p>" if ($page==1);
print '      <table width="500" border="0" cellspacing="0" cellpadding="8">';
print "<form name=\"reply\" action=\"$url\" method=\"post\">" if ($key eq $passwd);
for ($count=$begin;$count<=$end;$count++)
{
($fangshi,$comment,$date,$reply,$date2)=split(/\|/,$lines[$count]);
print '

      <tr>
        <td>
          <table CELLPADDING="8" CELLSPACING="2" BORDER="1" width="500">
            <tr> ';
              print '<td bgcolor="#ffffff" align="center"  width="80">';
             print '   <div align="right"><b>';
print "<a href=\"$url?action=delet&id=$count&page=$page&key=$passwd\">删除本帖</a> " if ($key eq $passwd);
print "                    <p>";
print '                    供求方式:</font></b></div>
              </td>
              <td width="300" bgcolor="#ffffff"><font color="#000000">';
print " $fangshi";
print '</font></td>
            </tr>
            <tr> ';
        print '   <td bgcolor="#ffffff" align="center"  width="80"> ';
            print '    <div align="right"><b><font color="#000000">';

print '                    供求内容:</font></b></div>
              </td>';
           print '   <td width="300" bgcolor="#ffffff"><font face="Arial, Helvetica, sans-serif" color="#000000">';
print "$comment";

print '                    </font><font color="#000000">';
print "<p align=right>$date</p>";
print '</font></p>
              </td>
            </tr>';

if(($key eq $passwd)||($reply ne ""))
{
print '              <tr>
              <td width="18%" valign="top">
               ';

print '                </td>
            </tr>';
}
print '</table>
        </td>
      </tr>
      <tr bgcolor="#ffffff">
        <td height="1"></td>
      </tr>';
}
print '<tr><td>';
print '<a href=index.cgi title=管理员退出><font color=#9D9D9D>管理员退出</font></a></td></tr>' if ($key eq $passwd);
print "<input type=\"hidden\" name=\"page\" value=\"$page\"></form>" if ($key eq $passwd);
print '<tr><td><p align="right">';
print "第$page页 ";
for($count=1;$count<=$pages;$count++)
{
print " <a href=\"$url?action=view&page=$count\"><font color=#9D9D9D>$count</font></a>" if ($key ne $passwd);
print " <a href=\"$url?action=view&page=$count&key=4R6H8w9N3h\">$count</a>" if ($key eq $passwd);
}
print '</p><td></tr>';
print '
    </table>
    <p> </p>
    </td>
</tr>
</table>';
print "                <p><a href=\"$url?action=admin\"><font color=\"#000000\">管理员登陆</font></a></font></p>";
print '          
      
         <p align=right>
          <font color="#999999" face="Arial">Power by cenliy</font>
</body>
</html>';
}


if($action eq "delet")
{
&delet;#调用delet子程序
exit;
}

#添加子程序delet
sub delet
{
if($key ne $passwd)
{
    &message("密码不正确!");#调用message子程序
    exit;
}
open (FILE,"guestbook.dat");
@lines=<FILE>;
close (FILE);

@lines=reverse(@lines);

$lines[$id]="deleted";

@lines=reverse(@lines);

open (FILE,">guestbook.dat");
foreach $temp (@lines)
{
    $temp=~s/\n//g;
    next if ($temp eq "deleted");
    print FILE "$temp\n";
}
close (FILE);

$key=$passwd;
&view;#调用view子程序
exit;  
}

if($action eq "admin")
{
&admin;#调用admin子程序
exit;
}
&view;#调用view子程序

#添加子程序admin
sub admin
{
print "Content-type: text/html\n\n";
print '<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
.char {  font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
td,p {  font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
</style>
</head>
<body bgcolor="#ffffff">
<div align="center">
<p> </p>';
print "        <form name=\"admin\" action=\"$url2\" method=\"post\"><p class=\"char\">请输入管理员名称:";
print '
<input type="text" name="email" size="25" style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid rgb(0,0,128)">';
print "        <p class=\"char\">请输入管理员密码:";
print '
<input type="password" name="key" size="25" style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid rgb(0,0,128)">
<p>
<input type="submit" name="Submit" value=" 确 定 " style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid">
<input type="reset" name="Reset" value=" 取消 " style="font-family: 宋体; font-size: 9pt; background-color: #00B000; border: 1px solid">
</form></p>
<p> </p>
</div>
</body>
</html>';  
}

#添加子程序message
sub message
{
my($info)=@_;
print "Content-type: text/html\n\n";
print '<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<style>
.char {  font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #00B000}
td {  font-family: "宋体", "楷体_GB2312", "仿宋_GB2312"; font-size: 9pt; color: #000000}
</style>
</head>

<body bgcolor="#ffffff">
<div align="center">
<p> </p>';

print "        <p>$info</p>";
print '        </td>

<p> </p>
</div>
</body>
</html>';
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
网易公司版权所有 ©1997-2009