网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 手机学院 | 邮件系统 | 网络安全 | 认证考试 |
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint |
当前位置 > 网站建设学院 > 网络编程 > Perl教程 |
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket |
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发 |
|
在确定底层的条件流程之后,剩下的惟一任务就是构建适合以后使用的对象。正如我在前面介绍的那样,可以使用 换言之,选票清单被用来构建一个 从另外一方面来说,虽然我通常认为使用一些依赖于外部资源(例如文件)的构造函数不是一个好的实践方法(因为这样可能会引起失败,并导致一些不可预知的状态),但是在这种情况下,以这种方式实现的代码将更易于理解。由于Perl并不依赖于指针,所以没什么理由不利用这种简单性。
防止出现重复投票的其他方法包括搜集IP地址或在客户机上设置cookie,但是我不想采用这种方法,因为很多学生可能会在校园中使用共享的公用终端。 在使用SASL认证时,您有两个选择:可以将这个脚本指向一台可以转发使用正确证书的电子邮件的机器,或者使用Perl |
调用$castBallot->dumpHTMLentrys()
方法会回显一个详细的信息,指出谁投票给了谁。实际上,我要注释掉这个调用,在选举结束之后使用Linuxat
批处理命令来关闭Web服务器。
当服务器关闭之后,您可以注释掉这一部分,并重新启动Web服务器,将其临时设置为
注意,在这个例子下,每个选票都不会被统计两次。在那些确定需要保密的情况中,可以使用一个简短的JavaScript函数来隐藏结果。诚然,有些人可能希望完全采用匿名投票,但是由于俱乐部的选举通常都是通过举手表决的,因此这很难实现安全的投票。
在考虑这种工作流程模式时,我意识到使用基于GET
的验证链接以及使用非加密验证链接的必要性,这样可以进行一些实验,读取这些链接,并基于指定的电子邮件地址和一些已知的验证链接来构建一些错误的确认投票。为了防止这种事情的发生,同时为了仍然能够通过非加密链接进行简单的调试,我决定在验证步骤中添加一、两项内容:为每个预选票添加一个惟一的标识符。
这个标识符是基于操作系统中正在执行的脚本的集成标识符(PID)的。为了让预测验证预选票的URL更加困难,我们可以再使用一个随机数。我之所以关心这个问题,是因为会有一些恶意的用户可能会对非常直观的URL模式进行破解,从而试图构建一些虚假的验证选票。这是代码的一部分,它不会直接转换为一个mod_perl
版本,因为它要依赖于正在运行的Perl的PID,以及另外一个随机数。如果这个表单是从一个重用的mod_perl
实例中生成的,那么在两次调用之间,PID可能并不需要改变。
然后,我又意识到能使这个链接更具迷惑性的方法是使用一个MD5生成的哈希值,从而有效地隐藏所有投票者的信息。这具有双向受益的优点:既可以使它很难被伪造,同时还维护了基于mod_perl
的脚本的可移植能力。缺点是代码有些难以调试,因为需要对客户机与服务器之间交换的信息进行监视。
安装过程要求Web服务器上有三种类型的目录:
还要注意的是,这种权限可以进行修改,这样,Web服务器就可以向这个目录中写入DBM文件的内容了。
清单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文件)。
$sudoperl-MCPAN-e'installMLDBM'$sudoperl-MCPAN-e'installMLDBM::Sync'$sudoperl-MCPAN-e'installMIME::Lite'
虽然我可以用一个静态IP地址在拥有已分配的域的站点中建立这种服务,但是我觉得动态DNS应该可以提供一些安全上的好处。通常,如果一个服务器没有静态IP地址,那么来自Web上的访问流量就不可能太大,动态DNS让我们可以在另外一个顶级域名之上临时建立一个可解析的机器名。这样我们就可以在Internet上快速出现,并快速消失,将遭受黑客攻击的风险降至最低。最好的方法是,这种服务是免费的。
还需要指出的是,将服务器配置为监听一个非标准的大一些的端口(例如8000)是很明智的,因为很多ISP都阻塞了端口80上的连接请求。客户机(投票者)通常可以从一个知名的静态地址(例如学校提供的主页)上的链接重定向到投票服务器上。在投票完成之后,提供Web服务的服务器就可以从Web上完全消失了,无需关闭或重新配置这台服务器。其中并没有任何缺点可以影响到所引用的页面(这台服务器是由其他人进行管理的)。在一些对政策敏感的环境中,这种考虑尤其重要。(有关使用动态DNS的更详细内容,请参阅
浏览器可以使用GET
和POST
方法将数据传递到所引用的页面中,从而对状态进行维护;也可以通过传递给服务器上的消息头中包含的cookie信息对状态进行维护。为了确认一张选票是从一个真实的人(至少是从一个有效的电子邮件帐号中)那里发出的,应该先将预选票发送到一个电子邮件地址进行确认。此外,cc:或bcc:消息也可以在以后引用。正如我前面介绍的一样,实现这种功能的最直接的方法是向投票者发送一个HTTPGET
结构化的链接。当然,有些作者会宣称用来更新记录的GET
方法并不好用。但是在这种情况下,任何这之后单击某一个链接的用户都只会接收一条更新消息,并且可以从这条消息了解每个候选人的目前有效选票,因此,这是无害的。
在使用这个脚本时,还要考虑其他一些安全问题,我们也应该考虑这些问题。任何允许外部实体来输入数据的程序都容易受到恶意的攻击,例如缓冲区溢出和嵌入式控制字符。反之,使用专用的程序来读写本地DBM文件至少具有以下优点:在没有SQL后门的地方,是不可能存在SQL插入攻击的。
在您同意需要对到达的数据进行过滤之后,我要将变量$CGI::DISABLE_UPLOADS
和$CGI::POST_MAX
设置为非常严格的值。另外我建议采用如下设置:
DATA
伪文件句柄之类的不完善系统在脚本的末尾保存数据。MLDBM
模块提供的机制。MLDBM
模块等效的PHP模块。
假如有机会构建一个这样的系统,同时试着保持它的简单性并使其自成一体,那么该系统可以使我能够研究一些非常有用的Perl模块。我发现为这样一个简单的项目定义特性和开发功能规范的过程既很有趣又是一种享受。我希望本文中在构建这种系统时的一些考虑事项可以为您实现类似的项目提供一些帮助。
![]() |