Linux中国  设为主页
 收藏本站
 
当前位置: > 首页 ->编程语言 ->Perl ->构建一个Perl/CGI投票系统
  相关分类: 
ASP
ViualBasic
UML / Rational Rose
PHP4/PHP5
Perl
JAVA/JSP教程
Delphi
ColdFusion
CGI
C/C++
ASP.NET
XML
  站内搜索: 
热门文章排行
热门文章排行 Perl的基本输入输出(06-05)
Perl文件及目录操作(06-05)
Perl语言全面编译(二)(06-05)
Perl常用系统函数(06-05)
用Perl来分析并生成中文Excel文件(06-05)
精采文章排行
精采文章排行 使用Perl连接Mysql数据库(06-05)
用Perl来分析并生成中文Excel文件(06-05)
受限制环境安装Perl模块方法(06-05)
PerlCookbook2介绍(06-05)
《极限编程》前言及第一章(06-05)
 

构建一个Perl/CGI投票系统

作者:Webmaster   来源:Linuxdby.com   点击:   日期:2007-06-05 [收藏] [投稿]

  IE是否经常中毒?推荐您

mod_perl的脚本的可移植能力。缺点是代码有些难以调试,因为需要对客户机与服务器之间交换的信息进行监视。

细节:文件布局
安装过程要求Web服务器上有三种类型的目录:

  • 一个可写的目录,用来保存用户提交的选票。
  • 一个位置,CGI需要在这里运行。
  • 一个位置,用来保存静态数据(例如CSS,logo图像,以及包含更详细指令的文件)。
  • 还要注意的是,这种权限可以进行修改,这样,Web服务器就可以向这个目录中写入DBM文件的内容了。

    清单2显示了在Web服务器上创建典型目录的过程。

    清单2.在Web服务器上设置目录
    $iduid=500(allan)gid=500(allan)groups=10(wheel),48(apache),500(allan)$sudomkdir/var/www/db/var/www/javascript//var/www/css/$sudochmod2775/var/www/db$sudochmod2755/var/www/javascript//var/www/css/$sudochownapache.apache/var/www/db/

    严格来说,只有cgi-bin(/var/www/cgi-bin)和DBM(/var/www/db)目录是绝对必需的,因为它们分别保存了脚本的可执行文件和投票数据。清单1中给出的文件布局是专用于Linux的,Web服务器进程的用户和组名可能有所不同,但实质上都需要在文件系统的适当地方放上几个Web服务器可以访问的组件。在将支持文件复制到各自的目录中之后,要确保对Web服务器的配置文件(例如httpd.conf)中的别名进行了正确更新。

    在创建清单2中所给出的目录之后,将ZIP文件中展开的内容复制到您的系统的类似目录中。其中最重要的是,ballot、DraftBallot.pm、BallotBox.pm和CastBallot.pm文件都需要位于cgi-bin目录中。我们只需要使用3个非标准的Perl模块;安装过程如清单3所示(更详细的信息,请参阅模块的README文件)。

    清单3.安装Perl模块
    $sudoperl-MCPAN-e'installMLDBM'$sudoperl-MCPAN-e'installMLDBM::Sync'$sudoperl-MCPAN-e'installMIME::Lite'

    细节:静态DNS与动态DNS
    虽然我可以用一个静态IP地址在拥有已分配的域的站点中建立这种服务,但是我觉得动态DNS应该可以提供一些安全上的好处。通常,如果一个服务器没有静态IP地址,那么来自Web上的访问流量就不可能太大,动态DNS让我们可以在另外一个顶级域名之上临时建立一个可解析的机器名。这样我们就可以在Internet上快速出现,并快速消失,将遭受黑客攻击的风险降至最低。最好的方法是,这种服务是免费的。

    还需要指出的是,将服务器配置为监听一个非标准的大一些的端口(例如8000)是很明智的,因为很多ISP都阻塞了端口80上的连接请求。客户机(投票者)通常可以从一个知名的静态地址(例如学校提供的主页)上的链接重定向到投票服务器上。在投票完成之后,提供Web服务的服务器就可以从Web上完全消失了,无需关闭或重新配置这台服务器。其中并没有任何缺点可以影响到所引用的页面(这台服务器是由其他人进行管理的)。在一些对政策敏感的环境中,这种考虑尤其重要。(有关使用动态DNS的更详细内容,请参阅参考资料一节的内容。)

    细节:GET有害吗?
    浏览器可以使用GETPOST方法将数据传递到所引用的页面中,从而对状态进行维护;也可以通过传递给服务器上的消息头中包含的cookie信息对状态进行维护。为了确认一张选票是从一个真实的人(至少是从一个有效的电子邮件帐号中)那里发出的,应该先将预选票发送到一个电子邮件地址进行确认。此外,cc:或bcc:消息也可以在以后引用。正如我前面介绍的一样,实现这种功能的最直接的方法是向投票者发送一个HTTPGET结构化的链接。当然,有些作者会宣称用来更新记录的GET方法并不好用。但是在这种情况下,任何这之后单击某一个链接的用户都只会接收一条更新消息,并且可以从这条消息了解每个候选人的目前有效选票,因此,这是无害的。

    其他可用的改进
    在使用这个脚本时,还要考虑其他一些安全问题,我们也应该考虑这些问题。任何允许外部实体来输入数据的程序都容易受到恶意的攻击,例如缓冲区溢出和嵌入式控制字符。反之,使用专用的程序来读写本地DBM文件至少具有以下优点:在没有SQL后门的地方,是不可能存在SQL插入攻击的。

    在您同意需要对到达的数据进行过滤之后,我要将变量$CGI::DISABLE_UPLOADS$CGI::POST_MAX设置为非常严格的值。另外我建议采用如下设置:

  • 将传入的所有意料之外字符的所有变量都转换成字符串,并将其截断为合理的限制长度。
  • 脚本中保存了很多运行时数据。这样做的优点是不需要部署很多的文件,并设置它们的权限。缺点是用户可能不想编辑代码,代码变得更加不够清晰。一种折衷的方法是利用诸如DATA伪文件句柄之类的不完善系统在脚本的末尾保存数据。
  • 文件加锁是一个非常棘手的问题,很多时候都存在竞争条件。看起来我所找到的任何一种所谓的文件加锁的正确指南,之后又都进行了更新。我试图最大限度地缩短打开文件的时间,并充分利用为MLDBM模块提供的机制。
  • Perl模块并没有放到CGI之外自己的路径中,因此从理论上来说,我们只能在cgi-bin目录中执行它。建议我们不要将这些模块设置为可执行的。
  • PHP是Linux平台上广泛存在的一种工具,因此如果需要重新实现这个系统,我考虑将这个脚本移植到PHP中。然而,我不确定是否有一个与MLDBM模块等效的PHP模块。

     如果您对本文有任何疑问或者建议,请到讨论区发表您的意见: >> 论坛入口 <<

    上一页 1 2 34 下一页

    上一篇:LINUX   下一篇:Perl小技巧:文件操作
    文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
       相关文章: ·使用Perl连接Mysql数据库·用Perl来分析并生成中文Excel文件·受限制环境安装Perl模块方法·PerlCookbook2介绍·《极限编程》前言及第一章·Perl简单模块指南·如何使用strict和warnings·Perl小技巧:文件操作·构建一个Perl/CGI投票系统·LINUX
       文章评论:(1条)   
     请留名: 匿名评论   点击查看所有评论 论坛讨论
     

     声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。