我正在尝试实现几乎所有网站中所做的事情:一个“喜欢”按钮(如 Facebook)不需要用户身份验证即可用于我网站上的所有文章都是用 Grails 编写的。
我不想使用任何外部解决方案,所以我需要自己实现它(或使用grails插件)。
所以我的问题是:如何实现这个“喜欢”按钮并最大限度地防止用户作弊?例如,我是否需要存储本地 cookie(我想是的)?是否需要检查HTTP请求的Session ID和IP?
例如,众所周知的在线投票实现是什么?
非常感谢您的帮助。
最佳答案
无需用户身份验证并完全防止作弊?没办法,抱歉。
您可以限制每个 IP 地址的投票,但 NAT、代理和 VPN 使这变得不可行(一个 IP 地址可以映射到许多用户 - 例如学校或市政网络,一个用户可以映射到许多 IP 地址 - 例如移动电话)连接或 DHCP 等)。
您可以设置 cookie,但可以非常轻松地删除这些 cookie,甚至不存储(Ctrl+Shift+Del,有人吗?)。
请注意,通过设置 cookie,您就可以防止 90% 的用户作弊(如果您的网站拥有精通技术且精通网络的受众,则效果会更少);唉,如果您没有某种方法来识别用户(例如通过身份验证),就无法完全避免作弊(即使如此,人们也会创建马甲来增加他们的选票数)。
Facebook 的“赞”按钮非常不同 - 它似乎不使用身份验证,但实际上它要求您登录 FB - 因此 FB 将投票计数存储在数据库中,而不是用户ID - 并知道哪个用户对什么进行了投票,从而防止了大多数选民欺诈。
示例 - “谁投票了什么”的表格:
user_id | article_id
1234 1
1234 5
1100 1
如果没有用户 ID,您需要设置一些匿名 ID。正如我上面概述的,这是可以做到的,但每次用户删除他们的 cookie 时,他都会在系统中显示为一个全新的用户。由于 session 是使用 cookie 实现的,因此同样的问题也适用于 session 。
如果您绝对需要允许匿名投票,您可以在 session 中存储该用户投票的文章列表:
{ 1, 5 }
并在访问页面时检查它。如果您将 cookie 和 session 过期时间设置得足够长,这将起到一定作用 - 但同样,一旦用户清除了他们的 cookie(或它们过期),bamf 他就消失了,并且看起来像一个新的用户。使用当前的技术,没有办法阻止这种情况(是的,有“持久cookie”、“闪存cookie”、“evercookies”等等,但归根结底,它们都只是用户可以使用的某种临时存储。删除)。
关于java - 如何实现一个无需用户认证且仍能防止用户作弊的类似Facebook系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538148/