创建一个PHP Web应用程序以允许用户对提交进行投票 - 如何最大限度地减少滥用

时间:2010-04-08 19:13:55

标签: php web-applications

我只写了一些小的php网络应用程序,我现在正在把代码放在一起,以允许用户提交短篇小说。这些故事将显示并允许其他人投票。获胜者会得到一些相当有价值的东西,我是偏执狂的人会试图操纵它。

Debian / Apache / PHP 5.2 / jquery

用户无需登录/验证。

用户可以投票多个​​故事,但每个故事只能投票一次

是否像使用IP地址标记每个故事并且不计算来自该IP的其他提交一样简单?谢谢你的任何建议。

8 个答案:

答案 0 :(得分:9)

不,这不是那么简单。欺骗IP地址相当容易,人们可以从几个地方投票。此外,很可能使用相同的IP地址连接不同的人/计算机。不同的人甚至(高度)尝试使用同一台计算机(和浏览器)进行投票。

即使是登录系统也不防水:你根本无法验证人的身份。用户可以输入不同的电子邮件地址和虚假数据,如姓名和出生日期。

另一方面,如果您想要在给定计算机上对给定浏览器进行唯一标识(与唯一用户相反),请查看Panopticlick并阅读{{3 }}

除此之外,你仍然可以(尝试)使用cookie来识别投票的浏览器。

答案 1 :(得分:5)

您可以将用户个人资料数据库放在一起。因此,您绘制某些用户信息,如IP,浏览器,位置,操作系统版本等。然后创建标准匹配或加权匹配系统,如果他们“太可疑”,就会清除人们。是的,你仍然会在这里和那里得到误报,但是如果你像你说的那样偏执,那么你可能最好在验证时进行一些 overboard 。为了获得更好的结果,请始终返回“成功”消息,以便他们认为他们正在游戏系统,而不是试图找到打败它的方法。

答案 2 :(得分:3)

如果您决定不实施登录/密码界面,则应使用双重验证系统。没有什么是完美的,但有了常识,我相信你可以建立一些好的东西。

  1. 从Cookie开始。只需使用story_id,datetime和定义的到期时间等数据保存一些cookie。这样一来,如果那台机器已经投票,它将无法在一段时间内再次投票,比方说24小时。

  2. 拥有一个数据库表,其中列出了为不同故事投票的所有IP。因此,当有人投票时,只需检查该IP是否在该特定故事的列表中。该表还应该有一个额外的列来保存从该IP执行的尝试次数。如果IP在列表中,并且cookie未设置,那么某人已经使用该IP投票,可能的情况是:

    • 也许他们在一所房子里,他们都在投票。
    • 也许他们在办公室,他们都在不同的机器上投票。
    • 也许他们在公共网络中,如咖啡馆或机场。

    在任何正常情况下,对于同一个故事,IP很少会尝试投票超过20次。你应该设置一个阈值“家庭多次相同的IP可以投票”。因此,如果没有cookie,并且IP投票的次数超过了您的阈值,那么您就知道出现了问题,并且您给该IP更长的等待时间,甚至可能将其完全阻止投票过程。

  3. 使用验证码。不要让投票太容易,但也不要太难。即使使用前面提到的验证系统的方法,您也可以使用验证码强制用户在单击“提交”之前思考/编写内容。你可以使用像重新上尉(http://recaptcha.net/)那样烦人的东西,或像m-captcha(http://code.google.com/p/m-captcha)/这样友好的外观。这样,黑客就会在试图覆盖你的安全措施时遇到痛苦。

答案 3 :(得分:2)

独特识别选民

  1. 有一个强大的验证码(如recaptcha),可防止自动尝试。这会阻止欺骗性IP和机器人。
  2. 将标识符存储在Cookie中。这有助于捕获具有不同IP的同一台计算机和浏览器上的人。
  3. 将IP存储在服务器上。这有助于在同一家庭网络上捕获具有多台计算机或浏览器的人。不幸的是,除了鲍勃在街上的大型通用汽车工厂投票之外,这也可能阻止所有人。告诉他们在家投票。
  4. 如果您从上面通过IP验证,请不要担心用户代理。这是多余的。

    如果您遵循所有三项指导原则,您也可以实时更新投票,因为您不能取消任何通过上述标准的投票。如果他们不能投票,你可能甚至不应该出示投票按钮,除非你要让人们改变他们的投票,这也是一个好主意,如果有迟到的参赛作品。

    如果我投票,我希望能够在我阅读后立即投票,然后如果我发现了一个我更喜欢的故事,我希望能够改变我的投票。

    投票系统

    现在,关于投票,你可能想要在计算任何投票之前要求来自同一“人”的至少三个不同短篇小说的投票。你将有更好的机会让最受欢迎的故事最终成为胜利者。

    例如,如果我发送链接给我的所有朋友投票给我的故事,他们还必须选择其他一些故事,可能是更好的故事。最糟糕的电影有可能最终赢得胜利,因为人们可能投票选出最差的两个和他们自己的投票,但是,在实践中,我从未见过这种情况。这是基于7年的电影节,都使用这个系统。

    此外,对于互联网竞赛,每个人在页面顶部获得相同的时间绝对至关重要,因此您应该找出一些方法来轮换或至少随机化这些条目。

    总是在比赛规则中加入一些关于评委们得出最终结论的内容。

答案 4 :(得分:1)

不,IP地址不是一个好的标识符。有人从例如浏览手机可能永远不会拥有相同的IP地址(甚至家庭用户也可以定期更改其IP地址)。

另一方面,从同一个房屋/办公室/代理服务器浏览的多人将被您的方法阻止

答案 5 :(得分:1)

使用php,您可以获得其浏览器的IP地址和用户代理

IP:$_SERVER['REMOTE_ADDR']

用户代理:$_SERVER['HTTP_USER_AGENT']

遗憾的是,它不是完美的方式,但确实可以最大限度地减少滥用行为。

您可以通过使用登录系统并存储此人使用Cookie投票的内容来加强这一点。但即便如此,它仍然不完美。

答案 6 :(得分:0)

最好的办法是尝试将信息存储在两个地方:

  1. 将用户的IP地址及其投票和故事存储在数据库表中,并在每次尝试投票时进行检查以查看它们是否已经存在
  2. 在用户的浏览器上放置一个cookie,尝试跟踪他们投票的内容。假设您不想在其中存储大量数据,您可以简单地为cookie分配一个ID并在上述表格中对其进行匹配,并进行检查。
  3. 将这两种方法结合在一起应该可以让你知道谁投了票,什么,不让某人第二次投票。当然,如果他们去多台机器,删除cookie,和/或更改他们的IP,你就无法阻止它。

答案 7 :(得分:0)

以下是我过去所做的事情:

  • 检查cookie
  • 在时间窗口内检查IP地址
  • 如果确定,请设置cookie并更新IP地址和时间(增加该IP的时间窗口?)
  • 始终尝试给用户投票的印象

如果是匿名投票,那么抓住所有诈骗者是不可能的。