如何在没有用户身份验证的情况下实施ilike Facebook系统并仍然阻止用户作弊?

fab*_*474 2 java grails facebook

我试图在几乎任何网站上实现一些功能:一个'ilike'按钮(如Facebook),不要求用户认证用于我用Grails编写的网站上的任何文章.

我不想使用任何外部解决方案,所以我需要自己实现它(或使用grails插件).

所以我的问题是:如何实现这个'ilike'按钮并防止用户最多作弊?例如,我是否需要存储本地cookie(我想是的)?我是否需要检查HTTP请求的会话ID和IP?

什么是用于比如网上投票知名的实现

非常感谢您的帮助.

Pis*_*3.0 6

没有用户身份验证完全防止作弊?不能,抱歉.

您可以限制每个IP地址的投票数,但NAT和代理和VPN使这个不可行(IP地址可以映射到许多用户 - 例如学校或市政网络,用户可以映射到许多IP地址 - 例如移动连接或DHCP等).

你可以设置一个cookie,但这些可以很容易删除,甚至不能存储(Ctrl + Shift + Del,任何人?).

请注意,只需设置一个Cookie,您就可以防止90%的用户作弊(如果您的网站拥有技术精湛的网络用户,则会减少); 唉,如果你没有某种方法来识别用户(例如通过身份验证),就没有办法完全避免作弊(即使这样,人们也会创建sockpuppets来提高他们的投票数).

Facebook的"喜欢"按钮是非常不同的 - 它似乎不使用身份验证,但实际上它要求您登录到FB - 因此FB将投票计数存储在数据库中,与用户ID相对应 - 并且知道哪个用户投票决定了什么,防止大多数选民欺诈.

示例 - "谁投票的内容"表:

user_id | article_id
1234         1
1234         5
1100         1
Run Code Online (Sandbox Code Playgroud)

如果没有用户ID,则需要设置一些匿名ID.正如我上面所概述的,这可以做到,但每次用户删除他们的cookie时,他都将作为系统的全新用户出现.由于会话是使用 cookie 实现的,因此同样的问题也适用于会话.

如果您绝对需要允许匿名投票,则可以在会话中存储此用户投票的文章列表:

{ 1, 5 }
Run Code Online (Sandbox Code Playgroud)

并在访问页面时检查它.如果你将你的cookie和会话到期时间设置得足够长,这将是一种很好的工作 - 但是,一旦用户清除了他们的cookie(或者他们过期了),bamf他已经离开并将看起来像一个新用户.使用当前技术无法阻止这种情况(是的,有"持久性cookie","flash cookies","evercookies"等等,但最终它们只是某种临时存储,用户可以擦除).

  • @ fabien7474:不可靠,误报太多 - 由于NAT,在任何一个IP地址后面都可能有1000个用户(并且由于IPv4池耗尽,这只会变得更糟); 也有太多的漏报 - 由于代理,VPN和加速器,用户可能会从几个不同的地址进来.结合cookie,它是一个有用的启发式算法,但不是绝对的衡量标准. (2认同)