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

创建一个PHP web应用程序,允许用户对提交的内容进行投票-如何最大限度地减少滥用,php,web-applications,Php,Web Applications,我只编写了几个小的php web应用程序,现在我正在编写代码,以允许用户提交短篇故事。这些故事将展示出来,并允许其他人投票支持。获胜者会得到一些相当有价值的东西,我很怀疑人们会试图操纵它 Debian/Apache/PHP5.2/jquery 用户无需登录/验证 用户可以对多个故事进行投票,但每个故事只能投票一次 它是否简单到只需在每个故事上加上一个IP地址,而不计算来自该IP的其他提交内容?谢谢你的建议。不,IP地址不是一个好的标识符。从手机浏览的用户可能永远不会拥有相同的IP地址(甚至家庭用

我只编写了几个小的php web应用程序,现在我正在编写代码,以允许用户提交短篇故事。这些故事将展示出来,并允许其他人投票支持。获胜者会得到一些相当有价值的东西,我很怀疑人们会试图操纵它

Debian/Apache/PHP5.2/jquery

用户无需登录/验证

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


它是否简单到只需在每个故事上加上一个IP地址,而不计算来自该IP的其他提交内容?谢谢你的建议。

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


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

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

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

另一方面,如果您想在给定计算机上获得给定浏览器的唯一标识(与唯一用户相反),请查看并阅读


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

最好将信息存储在两个位置:

  • 将用户的IP地址连同他们的投票和报道一起存储在数据库表中,并在每次尝试投票时进行检查,以查看他们是否已经拥有
  • 在用户的浏览器上放置cookie,以尝试跟踪他们的投票结果。假设您不想在其中存储大量数据,您可以简单地为cookie分配一个ID,并在前面的表中进行匹配,然后以这种方式进行检查

  • 将这两种方法结合起来,应该可以让你知道谁投了票,投了什么票,而不是让别人再次投票。当然,如果他们进入多台机器、删除cookie和/或更改IP,您无法阻止这种情况。

    您可以建立一个用户配置文件数据库。因此,你提取某些用户信息,如IP、浏览器、位置、操作系统版本等,然后创建一个标准匹配或加权匹配系统,在人们“太可疑”的情况下将其剔除。是的,你仍然会在这里或那里得到误报,但如果你像你所说的那样对合法性抱有妄想,你最好在验证上有点过火。为了获得更好的结果,请始终返回一条“成功”消息,以便他们认为自己在玩系统游戏,而不要试图找到击败它的方法。

    使用php,您可以像这样获得他们浏览器的IP地址和用户代理

    IP:
    $\u服务器['REMOTE\u ADDR']

    用户代理:
    $\u服务器['HTTP\u用户代理]

    不幸的是,这不是一个完美的方式,但它确实减少了滥用


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

    以下是我过去所做的:

    • 检查是否有饼干
    • 在时间窗口内检查IP地址
    • 如果确定,设置cookie并更新IP地址和时间(增加该IP的时间窗口?)
    • 总是试图给人一种印象,用户的投票被计算在内了

    不可能抓住所有骗子,如果是匿名投票,更是如此。

    如果决定不实施登录/密码界面,则应使用双重验证系统。没有什么是十全十美的,但凭常识我相信你可以做些好事

  • 从饼干开始。只需保存一些cookie数据,如,story_id,datetime和定义的过期时间。那样的话,如果那台机器已经投票了,它将在一段时间内无法再次投票,比如说24小时

  • 有一个DB表,其中列出了投票给不同故事的所有IP。所以,当有人投票时,只需检查该IP是否在该特定故事的列表中。该表还应该有一个额外的列来保存从该IP执行的尝试次数。如果IP在列表中,且未设置cookie,则有人已使用该IP进行投票,可能的情况如下:

    • 也许他们在一所房子里,他们都在投票
    • 也许他们在办公室里,他们都在不同的机器上投票
    • 也许他们在公共网络中,比如咖啡馆或机场
    在任何一种正常情况下,一个IP尝试为同一个故事投票超过20次的情况都是非常罕见的。您应该设置“同一IP可以多次投票”的阈值。因此,如果没有cookie,并且某个IP的投票次数超过了您的阈值,那么您就知道出了问题,您会给该IP更长的等待时间,甚至可能会完全阻止它参与投票过程

  • 使用验证码。投票不要太容易,也不要太难。即使使用前面提到的验证系统的方法,您也可以在单击“提交”之前添加验证码,以迫使用户思考/写一些东西。你可以使用诸如重新验证码()之类的恼人的东西,或者像m-Captcha()这样看起来友好的东西。这样的话,黑客会很痛苦地试图覆盖你的安全措施


  • 唯一识别投票者

  • 具有防止自动尝试的强验证码(如recaptcha)。这会阻止