2013-01-15 40 views
3

我已经在谷歌应用程序引擎中使用Python编写了一个简单的博客。我想为我的每个帖子实施投票系统。我的帖子存储在SQL数据库中,我有一个没有收到投票的列。有人可以帮我设置个人帖子的投票按钮吗?我使用Jinja2作为模板引擎。如何在我的博客中为帖子实施“投票”系统?

我怎样才能使投票安全吗?当有人点击投票按钮时,我正在考虑发送POST/GET,然后我的Python脚本将相应地读取并更新数据库。但后来我意识到这是不安全的。所有建议都欢迎。

+0

关注游客可以投票N次吗? – svidgen

+0

@svidgen是的,确切地说。 –

回答

4

首先,请记住,没有“安全”之类的东西,只是“对X而言足够安全”。总是有一种折衷 - 更安全的方式,让你的合法用户更讨厌,而且更贵。

获得过去这些泛泛而谈,想想你的具体情况。没有什么与用户有一对一的关系。 IP地址或计算机通常由多人共享,同时人们通常拥有多个地址或计算机。有时候,这样的事情“足够好”,但从你的问题来看,听起来不像。

但是,对于用户帐户,唯一的假阴性来自人们故意创建多个帐户或黑客窃取他人的帐户,并且没有误报。并且在烦恼/成本与安全性权衡之间存在一个非常线性的曲线,从“”请不要创建袜子木偶“到CAPTCHA,通过信用卡检查到信任/信誉分数网络以询问现实生活中的信息并聘请调查员检查出来。

在现实生活中常常是不仅仅是这两件事情之间的权衡。例如,如果你愿意接受更多的欺骗,如果它直接意味着更多的钱你,你可以只收取人真正投钱(与那些1-900线,许多电视节目使用)。


如何做Reddit和Digg检查单个注册用户的多个投票?

我不确切知道Reddit或Digg如何操作,但总体思路很简单:跟踪个人投票。

通常,您已将用户存储在某种SQL RDBMS中。因此,您只需添加一个Votes表格,其中包含用户ID,问题ID和答案。 (如果您使用的是某种NoSQL解决方案,应该很容易进行翻译,例如,每个问题都有一个文档,文档是一个将用户ID映射到答案的字典。)当用户投票时INSERT一行放入数据库。

将投票界面放在一起时,无论是通过服务器端模板还是客户端AJAX,都可以调用一个检查现有投票的函数。如果有一个,而不是显示投票控制,显示一些代表“你已经投票是。“你还希望在投票记录时再次检查,以确保有人不打开200个页面的副本,所有这些都允许投票(因为用户还没有投票),然后提交200是投票,但是对于SQL数据库,这与将Question, User制作成多列唯一密钥一样简单。

如果要允许投票更改或撤消,只需向界面添加更多控件,然后处理它们与UPDATEDELETE调用。如果你想得到真正喜欢这个网站,这允许撤消,如果你有足够的代表,如果你的原始投票过去5分钟或答案已经编辑,因为你的投票(或某事就像那样) - 你可能需要保留一些额外的信息,比如为每个投票行为记录一行,并附上时间戳,而不是一个简单的答案。呃为每个用户。

此设计还意味着,您可以通过例如SELECT COUNT(*) FROM Votes WHERE Question=? GROUP BY Answer即时生成投票计数,而不是在某个位置进行计数。但是,像往常一样,如果这太慢,您可以随时优化反规范化,并将总数与实际投票保持一致。同样,如果您的用户群很庞大,您可能需要归档旧问题的投票并将其从运营数据库中提取出来。等等。

+0

Reddit和Digg如何检查单个注册用户的多个投票? –

+0

@VaishakVKumar:让我编辑答案,因为在评论中解释可能太长。 – abarnert

+0

优秀的答案。非常感谢你! –

1

如果投票仅供订阅用户,然后启用投票权的成员登录到您的网站后。 如果没有,那么你可以跟踪用户的IP地址,使一个IP地址,可以在一天内单篇文章投票一次。

顺便说一句,你需要什么样的安全?

+0

使用IP来限制投票比较容易,但当多个用户来自同一个IP(例如大学)时,它不起作用。 – sean

+0

选民将是注册用户。 –