投票系统黑客证明

el_*_*_le 1 security authorization

我正在实施像Stackoverflow这样的投票系统.我怎样才能实现这一点,这是黑客证明?

我有一些PHP根据javascript解析后发送的ajax请求进行数据库工作.是否会进行查询以检查用户的当前投票状态是否足以避免未经授权的投票?

Ser*_*sev 7

绝对可以实现非常可靠的解决方案.但这必须在服务器端完成.

安全的基本规则:您不信任客户端数据.

将所有支票移至PHP并使您的JavaScript变得愚蠢

$(".vote").click(function(e) {
    $.post('/vote.php', vote_data, function(result) {
        // update UI according to returned result
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,仍然需要对客户端进行检查,但这是一种提高可用性(标记未填充的必填表单字段)或减少服务器负载(通过不发送明显不完整的数据)的方法.这些客户端检查是为了用户的舒适,而不是为了您的安全.

回答您更新的问题:

如果你存储了哪个用户投票选择哪个问题的完整日志,那么是的,很容易防止多次投票(当用户可以多次投票同样的事情时).当然,假设不允许匿名投票.

但是如果你有一个受欢迎的网站,这个日志可能会变得很大并且成为一个问题.有些系统试图通过禁用对旧文章的投票(并删除相应的日志条目)来逃避.

如果有人故意试图破解我怎么办?

恶意用户可以执行不同类型的攻击.

CSRF(跨站请求伪造)

本文列出了一些防止攻击的方法.Modern Ruby on Rails具有内置保护功能,默认情况下已启用.不知道PHP世界是怎么回事.

点击劫持

这种攻击诱使用户点击他们想不到的东西.例如,他们可能会点击"播放视频",但该网站会截取此点击并在用户的墙上发布.

网上也有一些文章.

  • 这是一个非常突出的观点.+1到@Rook.虽然很多关于你的答案非常好,但到目前为止所有的答案都只是真正解决了相对合法和诚实的用户行为 - 主要集中在停止重复投票上.您还需要考虑如何在恶意用户窃取其他人的投票之前停止系统游戏,然后他们才有机会(有意)投出他们自己的投票选择.如果我可以让10,000个用户代表我投票,而没有他们意识到他们正在这样做,我不需要重复投票来结果. (2认同)