退出投票
运用事物当前建立的方式,一个用户可以为一特定的选项投票多次,因此违反了民主的基本原则之一:一个公民,一张投票。虽然不大可能有很多用户会有耐心或者爱好做这样的事情;然而,这是一个漏洞,而且应该被堵住。
我已经决定一旦成功地进行了投票就在投票者的计算机系统中建立一个cookie。对脚本增加几行代码,无论何时用户试图投票的时候,我现在可以检查该cookie的存在与否,然后据此决定是否接受该投票。
下面是代码,它被添加到user_submit.php脚本的最顶部。
<?php // check if a cookie exists for this question // deny access if it does if (isset($_COOKIE) && !empty($_COOKIE)) { if ($_COOKIE['lastpoll'] && $_COOKIE['lastpoll'] == $_POST['qid']) { die('ERROR: You have already voted in this poll'); } } // set cookie setCookie('lastpoll', $_POST['qid'], time() + 2592000); ?>
将该代码放置在合适的地方,当用户投票时,一个cookie被建立在客户端浏览器中,它包含着用户投票的问题ID号。在之后每次的投票企图中,该脚本将会首先检查cookie的存在与否,若该cookie存在,那么检查cookie变量——$_COOKIE['lastpoll']的存在与否。只有在该cookie不存在(意味着这是第一次投票)或$_COOKIE['lastpoll']的值不同于当前投票问题的ID(意味着用户之前投过票,但该ID对应的是不同的问题)时,该投票才会被接受。
这绝不是十分安全的:任意相当熟练的用户可以从客户端的缓冲区里面删除cookie然后再次投票(但它确实为进程增加了一层安全)。当然,理想的方法就是在服务器端追踪投票者的信息然后拒绝已经投过票的人投票;而且确实,如果站点在接受其在线投票之前需要用户注册一个唯一的用户名的话,那么该方法是一种可行的选择。
恩,那就是本章所讲的内容。希望该练习已经使你深入了解了如何将PHP用于建立简单的Web应用,而且解释说明了其作为Web媒体的快速开发工具的能力和灵活性。请快速回来阅读最后部分的PHP 101,以及一个更加DIY的应用程序。