我在谷歌应用引擎中使用Python编写了一个简单的博客。我想为每个帖子实施一个投票系统。我的帖子存储在SQL数据库中,我有一列没有收到投票。有人可以帮我设置个别帖子的投票按钮吗?我使用Jinja2作为模板引擎。
如何确保投票安全?当有人点击我的python脚本然后读取的投票按钮并相应地更新数据库时,我正在考虑发送POST / GET。但后来我意识到这是不安全的。欢迎提出所有建议。
答案 0 :(得分:4)
首先,请记住,没有“安全”这样的东西,只有“足够安全的X”。总是有一个权衡 - 更安全的方式对你的合法用户来说更烦人,对你来说更贵。
了解这些一般性,考虑一下你的具体情况。没有任何东西与用户有一对一的关系。 IP地址或计算机通常由多人共享,同时,人们通常拥有多个地址或计算机。有时,像这样的东西“足够好”,但从你的问题来看,它听起来并不像它。
但是,对于用户帐户,唯一的漏报来自有意创建多个帐户或黑客攻击他人帐户的人,并且没有误报。在烦恼/成本与安全权衡之间存在一条相当线性的曲线,从“请不要创建袜子木偶”到CAPTCHA到信用卡支票到信任/声誉分数网来询问现实生活中的信息并雇用一名调查员来检查它。
在现实生活中, more 之间经常需要权衡这两件事。例如,如果你愿意接受更多的作弊,如果它直接意味着你有更多的钱,你可以向人们收取真钱投票(就像很多电视节目使用的1-900行)。
Reddit和Digg如何检查来自单个注册用户的多个投票?
我不确切知道Reddit或Digg是如何做事的,但总的想法很简单:跟踪个人投票。
通常,您已将用户存储在某种SQL RDBMS中。因此,您只需添加一个Votes
表,其中包含用户ID,问题ID和答案的列。 (如果您正在使用某种NoSQL解决方案,则应该很容易进行适当的翻译。例如,可能每个问题都有一个文档,文档是将用户ID映射到答案的字典。)当用户投票时,只需INSERT
进入数据库的一行。
将投票界面放在一起时,无论是通过服务器端模板还是客户端AJAX,都要调用检查现有投票的函数。如果有一个,而不是显示投票控制,显示“你已经投票赞成”的一些表示。您还想在投票记录时间再次检查,以确保有人不打开系统的200个副本,所有这些都允许投票(因为用户尚未投票),然后提交200是投票,但使用SQL数据库,这就像将Question, User
转换为多列唯一键一样简单。
如果您想允许更改或撤消投票,只需向界面添加更多控件,然后通过UPDATE
和DELETE
来电处理它们。如果你想真正喜欢这个网站,如果你有足够的代表,如果你的原始投票是在过去的5分钟,或者你的投票后答案已被编辑(或类似的东西),你可以撤消 - 你可以必须保留一些额外的信息,比如为每个投票操作记录一行,并带有时间戳,而不是每个用户只有一个答案。
此设计还意味着,您可以通过例如SELECT COUNT(*) FROM Votes WHERE Question=? GROUP BY Answer
动态生成投票计数,而不是在某处保留计数。但是,像往常一样,如果这太慢,你总是可以通过非规范化进行优化,并将总数与实际投票保持一致。同样,如果您的用户群很大,您可能希望对旧问题进行存档投票,并将其从运营数据库中取出。等等。
答案 1 :(得分:1)
如果投票仅适用于订阅用户,则在会员登录您的网站后启用投票。 如果没有,那么您可以跟踪用户' IP地址,因此一个IP地址可以在一天内为一篇文章投票一次。
顺便问一下,你需要什么样的安全性?