12

我正在为我的 PHP/MySQL 网站创建一个投票系统,我想确保一个用户只能投票一次。这样做的好方法是什么?到目前为止,我已经想到并半实现了以下内容:

  • 使用 IP 和投票将个人投票存储在数据库中。这会造成体积庞大,但可以确保每个用户都获得一票。

  • 在用户端存储一个 cookie 以检查他们是否投票。这是最简单的,但显然用户可以禁用 cookie。

什么是最实用的方法?任何其他建议都非常受欢迎。

4

7 回答 7

26

无法获得的完美:(唯一的政府编号)

  • 用户使用可验证的唯一标识符(如社会保障或护照号码)进行投票

足够接近现实:(电子邮件/第 3 方身份验证)

  • 用户使用电子邮件地址和密码(或 google/facebook)注册帐户
  • 1 个电子邮件地址 = 1 票
  • 用户无法清除 cookie 并获得额外选票,App 不会通过共享 IP 关闭 1000 个

善意但虚假的伪装(IP 地址)

  • 办公楼:同一外部 IP 上的 1000 名用户被拒之门外
  • 大学:在教室里连接到无线网络。投票。搬到下一个教室。重新连接并再次投票

崩溃和燃烧(饼干)

  1. 投票
  2. ctrl shft 输入
  3. 投票
  4. 重复
于 2011-10-15T05:58:20.463 回答
4

如果您想有机会审核您的系统,您应该在数据库中存储尽可能多的信息。如果您记录很多,那么即使存在投票欺诈,您也可能能够检测到它并取消这些投票。

第二种方法是完全不安全的。如果用户想再次投票,他们可以删除 cookie,您将无法检测到这种情况已经发生。

重要的提示

一个人的 IP 地址之间没有一对一的映射。有些人有多个 IP 地址,而其他人共享一个 IP 地址。

于 2011-10-15T05:27:24.303 回答
3

一个完全可靠的方法将是棘手的。您的两个想法都有问题 - cookie 可以被禁用,一个用户可能有多个 IP 和/或多个用户可能共享同一个 IP。强制您的用户注册并只允许每个注册帐户投一票会更好,但是有人可能会注册多个帐户。对每个帐户强制进行唯一的电子邮件验证可以在一定程度上减少这种情况,但您仍然可以通过注册多个不同的电子邮件来解决它。

基本上,你采取的每一项措施都会让你更难绕过,但首先也会增加投票的努力。没有将投票与可以验证的已知唯一(SSN、护照号码)联系起来,您采取的任何措施都可以被规避,这取决于它付出了多少努力。除了其他措施外,手动审查可疑的选票也有助于减少欺诈性选票。在易用性和安全性之间划清界限的位置实际上取决于您,这取决于您需要多少来强制执行一票限制。

于 2011-10-15T05:48:35.543 回答
2

正如 Mark Byers 所说,一些国家可能有动态 IP 地址(例如越南),因此每次用户建立连接(或重置调制解调器)时,IP 地址都会不断变化。但是,如果您可以确保您的系统构建在 IP 地址是静态的国家/地区,那就没问题了。

cookie 解决方案似乎有点不安全,但如果您的大多数用户是非技术人员,那么他们将无法识别诀窍(即删除 cookie 并再次投票)。对我来说,只要我知道我的用户对这种技术一无所知,我就不喜欢这种方式。

我建议你进行email verification民意调查,这样结果会更准确。一个用户可能只有几个电子邮件地址,他们不想创建新的只是为了投票。

于 2011-10-15T05:56:08.943 回答
2

无论您决定使用什么,IP 地址都不会安全。用户基本上可以从不同的位置访问并再次投票等。Cookie 是一种解决方案,但由于删除的可能性而未优化(因此您冒着用户识别过程的风险)。您将需要处理来自用户的更多数据,以便能够安全地记录他们的选择。

如果系统是更大系统的子系统,也许你可以使用更大系统中常见的字段来识别当前系统中的用户。

希望这可以帮助,

于 2011-10-15T06:13:51.007 回答
2

确保用户只投票一次的唯一方法是创建用户帐户,因为:

Cookie 可以删除

IP地址是为了改变。(另外,多个用户可以有一个 IP 地址)

于 2011-10-15T18:18:00.233 回答
1

使用 IP 和投票将个人投票存储在数据库中。这会造成体积庞大,但可以确保每个用户都获得一票。

这很好,但比第二慢,但我仍然推荐这个。

在用户端存储一个 cookie 以检查他们是否投票。这是最简单的,但显然用户可以禁用 cookie。

你说得对,它不安全,但速度有点快,但我不喜欢这样

于 2011-10-15T05:36:28.083 回答