我在谷歌应用引擎中使用 Python 编写了一个简单的博客。我想为我的每个帖子实施一个投票系统。我的帖子存储在 SQL 数据库中,并且我有一列表示没有收到的选票。有人可以帮我为个别帖子设置投票按钮吗?我使用 Jinja2 作为模板引擎。
如何确保投票安全?当有人单击投票按钮时,我正在考虑发送 POST/GET,然后我的 python 脚本将读取并相应地更新数据库。但后来我意识到这是不安全的。欢迎所有建议。
我在谷歌应用引擎中使用 Python 编写了一个简单的博客。我想为我的每个帖子实施一个投票系统。我的帖子存储在 SQL 数据库中,并且我有一列表示没有收到的选票。有人可以帮我为个别帖子设置投票按钮吗?我使用 Jinja2 作为模板引擎。
如何确保投票安全?当有人单击投票按钮时,我正在考虑发送 POST/GET,然后我的 python 脚本将读取并相应地更新数据库。但后来我意识到这是不安全的。欢迎所有建议。
首先,请记住,没有“安全”之类的东西,只有“对 X 来说足够安全”。总有一个权衡——更安全意味着对您的合法用户来说更烦人,对您来说更昂贵。
超越这些一般性,想想你的具体情况。没有什么与用户有一对一的关系。IP地址或计算机通常由多个人共享,同时人们通常拥有多个地址或计算机。有时,这样的事情“足够好”,但从你的问题来看,这听起来不像。
但是,对于用户帐户,唯一的误报来自人们故意创建多个帐户或入侵他人的帐户,并且没有误报。在烦恼/成本与安全性的权衡中,有一条非常线性的曲线,从“请不要创建袜子木偶”到验证码,再到信用卡检查,再到信任/声誉评分网络,再到询问现实生活中的信息。并聘请调查员进行检查。
在现实生活中,通常需要在这两个方面进行权衡。例如,如果你愿意接受更多的作弊,因为这直接意味着你有更多的钱,你可以向人们收取真钱投票(就像许多电视节目使用的 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
. 但是,像往常一样,如果这太慢了,您总是可以通过非规范化进行优化,并将总数与实际投票保持一致。同样,如果您的用户群很大,您可能希望对旧问题的投票存档并将它们从操作数据库中取出。等等。
如果投票仅针对订阅用户,则在会员登录您的站点后启用投票。如果没有,那么您可以跟踪用户的 IP 地址,以便一个 IP 地址可以在一天内为一篇文章投票一次。
顺便问一下,你需要什么样的安全措施?