3

我一直在阅读关于在 PHP 中创建投票系统的 stackoverflow,以最大限度地减少来自同一用户的滥用/多次投票,但我还没有找到我的问题的答案。

我有一个应用程序,用户无需注册即可投票或“喜欢”条目。显然,我想尽量减少滥用,我不想限制每个 IP 地址的投票,因为某些组织(包括我的)使用共享 IP 地址。

我以前从未在未经身份验证的系统中使用过会话,但由于此应用程序以入场投票为中心(用于纯粹的娱乐价值,但我仍然想尽量减少滥用)我想知道这种方法是否可行以及是否有任何缺点,例如性能影响,甚至是否可以以这种方式使用会话:

  • 加载网站时启动会话
  • 每个会话允许每个项目一票

如果这是一个坏主意,我的替代选择是允许每个 IP 地址有合理数量的投票(比如 25 个),或者在来自同一 IP 地址的投票之间设置时间限制。

你们有什么建议/你认为什么对用户来说最烦人?重新启动浏览器、在投票之间等待 5 分钟或清除 cookie?

4

4 回答 4

5

There is really no way to make a "serious" voting system without user authentication, all other options have flaws:

  • sessions end when you close the browser, so just reopen it and you'r fresh
  • cookies are your best shot, but they can be cleared or even refused
  • ip addresses are unreliable and/or not applicable
于 2010-04-21T08:48:48.257 回答
1

只有会话是坏主意,因为如果您关闭浏览器并再次访问,您将能够投票。您可以将会话用作“帮助”。最好的选择是使用 ip 限制。您也可以使用 cookie,但它又只是一个“帮手”,因为您可以从浏览器中清除 cookie。我建议你像你说的那样使用 ip 限制,一个 ip 可以投票 25 次,并使用 cookie 来限制一台计算机多次投票。因此,如果用户想要投票超过一次,他可以删除一个 cookie,但他不能投票超过 25 次。

于 2010-04-21T08:46:37.980 回答
1

我同意肯普的观点,饼干是最好的选择。此外,会话也使用 cookie - 不同之处在于会话 cookie 在浏览器关闭时被删除,“简单” cookie - 当它过期时,在这种情况下“更好”。

如果谈论 IP 地址,用户可以使用代理绕过“IP 过滤”。

投票结束后,有人可能会查看结果以查看是否有任何可疑之处(例如 5 分钟内来自单个 IP 的 100 票)——这将有助于获得更真实的结果。

于 2010-04-21T08:56:28.647 回答
0

您可以同时使用 cookie 和服务器缓存机制,如 apc/memcached。使用相同的键/cookie 名称将投票结果存储在 cookie 和 apc 缓存中,并检查两者是否存在。如果 cookie 被删除但 apc 密钥仍然存在,那么您知道有人正在尝试重新投票,您可以重置 cookie 并增加 apc 缓存值的生命周期。

这不是防弹的,但在没有数据库的情况下,我认为这是一个很好的解决方案。请记住,如果服务器内存不足,它将刷新 apc 缓存。

于 2012-01-04T11:12:35.950 回答