2011-10-21 101 views
11

好的,所以我打算用upvote/downvote功能制作一个网站。在没有深入了解网站其他部分的详细信息的情况下,用户将能够提交可投票的内容(与此类似,仅限于此)。本网站上唯一的“帐户”将面向管理员和版主,这使我想到了主要问题:在网站上实施upvotes/downvotes的最佳方式是什么?

如何在没有帐户的情况下尽可能优化每个用户的投票数?

也将使用Django和MySQL做出的网站,这引出了我的第二个问题:

如何存放票MySQL数据库?我应该在每个帖子的字段中存储一个整数吗,还是应该是一个每行有一个投票的表?我的猜测肯定是前者,但我从来没有像以前那样工作过,所以我只想确定一下。

任何人都可以指出我如何实现我想要的功能的大方向?我一直在想它,并且我想到了使用会话变量,cookie和/或IP地址的方法。我知道如果没有帐户,任何解决方案都不是完美的,但我只想要一些足够好的方法来防止垃圾邮件投票。我很无助,所以所有的帮助表示赞赏。

+0

您应该单独存储upvotes和downvotes,主要是因为并发问题更新了投票计数。 – fredley

+3

通过限制IP地址,您将失去大量可能的选票。许多学校,企业甚至宿舍使用1个外部IP地址给许多用户。没有用户帐户,没有好的方法来实现一个系统。因为限制100名员工拥有1个人的投票将是不准确的,就像没有IP限制一样。 – JClaspill

+0

@JClaspill我应该在我的问题中提到过这个,但该网站实际上是针对我大学的学生(我甚至计划将发布的内容排除在他们之外)。我的28,000多名学生的大学有什么机会为每个人使用相同的IP地址? – GRardB

回答

7

非常困难。

大多数其他网站在那里做upvote/downvote使用帐户是因为几乎没有其他方式来保证用户将无法投票两次在同一件事。

提供给你的信息应该“窄”你的这个用户是否已经投票前的余地:

  • 他们的IP地址
  • 他们的UA字符串(可以用来进一步缩小后场第一)
  • 您已存储在浏览器

正如你可以清楚地看到任何cookie /会话数据,所有这些信息是随时更改,大部分会由恶意用户随意控制。如果你想保护自己免受恶意用户的侵害,最好的办法就是用户帐户。

如果你只是想保护自己免受合法用户投票两次,只需使用IP地址 - 他们是持久的足够,普通用户将无法在短时间内投票两次。

对不起,我不能提供更多帮助,据我所知,这仍然是那些未解答的问题之一。很多人希望能够保证访问者与之前访问者相同或不同,因为有几百个不同的原因,但使用当前技术是不可能的。

+0

6年过去了,唉。浏览器指纹识别技术是您可以使用的一种技术,但它远远不能保证,而且作为恶意用户也很容易绕过。用户帐户仍然是要走的路。 –

0

商店的票数表:

id | post_id | vote_value (+/-1) | ip 

入住这张贴检查这个IP的时候并没有对这个问题之前公布。不完美,但很不错。

vote_value列的表上总结此表以找出给定post_id的投票。

0

简而言之,限制用户不止一次投票的最佳方式是通过IP进行跟踪(假设您不想强制用户登录并拥有帐户。可以轻松地清除Cookie或用户可以只改变自己的浏览器。

考虑使用PHP,并将其存储在一个数据库跟踪IP。 http://php.net/manual/en/function.getenv.php

3

我会强烈建议使用用户帐户最小化的问题。使用ip地址是不是简单的例子就是一些公司只向外界提供一个IP地址,在这种情况下,你的社区将没有适当的分布,人们可能会质疑你的投票系统。但是,如果你决定去与用户账户系统,你可以按照这样的事情:

post_table 
+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| postId  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| userId  | int(10) unsigned | NO | MUL | NULL |    | 
| postTime | bigint(20)  | NO |  | NULL |    | 
| post  | text    | NO |  | NULL |    | 
| upVote  | int(11)   | YES |  | 0  |    | 
| downVote | int(11)   | YES |  | 0  |    | 
+------------+------------------+------+-----+---------+----------------+ 

user_of_website 
+--------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+--------------+------------------+------+-----+---------+----------------+ 
| userId  | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| userName  | varchar(50)  | NO |  | NULL |    | 
| numPosts  | int(10) unsigned | NO |  | 0  |    | 
| postsCount | int(11)   | NO |  | 0  |    | 
+--------------+------------------+------+-----+---------+----------------+ 

您也可以使用,你必须从正面只有一个柱和负GET扣除不同的模型。

希望这会有所帮助。

+1

用此模型用户可以upvote一个帖子两次。 – Ced

0

老问题,但我会拍摄。最终,任何尝试对恶意用户进行任何级别投票合法性的系统都将不得不利用CAPTCHA(或一些防止僵尸等效物),但实际创建帐户不是必需的。一旦用户通过CAPTCHA验证他的人性,在他的计算机上存储一个cookie,以编码他的IP地址数据。只要用户维护该cookie,他就可以将其作为密钥投票,并且可以使用密钥(IP地址)作为标识符。如果cookie以某种方式被删除,您只需通过CAPTCHA重新认证并重新获取他的IP地址即可。

当然,恶意用户可能很容易欺骗一个IP,但是CAPTCHA会阻止他一次只做几个,所以它只会在基于帐户的网络上造成与恶意用户一样的破坏性多个假帐户。

相关问题