java - 如何实现一个无需用户认证且仍能防止用户作弊的类似Facebook系统?

标签 java facebook grails

我正在尝试实现几乎所有网站中所做的事情:一个“喜欢”按钮(如 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/

相关文章:

validation - Grails:更改属性名称 “errors”

java - Spring MVC DispatcherServlet 的延迟实例化?

java - Java运行时执行shell脚本时会在哪里创建nohup.out文件?

java - 在PDF的每一页附加水印图像

php - 多个用户在php中使用mysql连接

c# - 可重用的 Linq to XML 方法来过滤我的查询结果

Grails RadioGroup,如何将标签绑定(bind)到电台名称

java - 在 Struts 2.x 中使用自定义资源包/属性扩展库

java - 如何在处理 Open Office 文档后停止 Java

javascript - 使用 FBJS 中的 json 对象更改 HTML SELECT OPTION