有哪些技术可以防止多次提交比赛?

Posted

技术标签:

【中文标题】有哪些技术可以防止多次提交比赛?【英文标题】:What techniques are there for preventing multiple submissions to a competition? 【发布时间】:2011-08-08 00:27:18 【问题描述】:

项目

我们有一个用 php 编码的竞赛,使用 CodeIgniter。该表格对电子邮件地址和手机号码进行了验证。页面本身托管在不同域的 iframe 中(这是一种代理-客户关系)。

问题

我们让用户拥有 1000 条条目。我们知道它们是假的,因为:

    他们使用相同的手机号码 - 假设他们找到了一个通过验证的手机号码,然后每次都使用它。 电子邮件地址都位于奇怪的域中,其中一些域重复了多次。

但是,IP 地址是唯一的,条目分布在几天内,域本身有 MX 记录,用户代理看起来很正常。

客户不想做任何可能导致条目减少的事情。

问题

Captcha 等方法的优缺点是什么?您使用了哪些有效的 UI 和代码模式?

我阅读的一种方法是允许可疑条目,以便垃圾邮件发送者的条目被接受,但他们的数据有一个“可疑”标志,然后手动检查。我可以检查哪些数据来判断是否可疑?

【问题讨论】:

【参考方案1】:

你可以使用的一些方法:

验证码:阻止机器人提交表单 电子邮件验证:向他们发送一封带有唯一链接的电子邮件,以激活他们的参赛作品。停止无效的电子邮件地址。 手机号码验证:向他们发送带有激活码的短信。停止无效的电话号码。

在我看来,您的方法不应该是阻止提交条目,而是要求对输入的详细信息进行一定程度的验证。

【讨论】:

自动化点击电子邮件地址的过程肯定不难吧?我们已经在验证域是否有 MX 记录。我同意手机号码验证会更难被击败。 我担心的不是点击电子邮件帐户的自动化,而是电子邮件地址的有效性,并确保人们不会输入垃圾电子邮件地址只是为了找到唯一的组合。【参考方案2】:

验证码的缺点:

    用户讨厌它,如果实施不当会令人沮丧(例如,验证码失败会重置其他表单字段)。 当字母难以阅读时,合法用户可能难以完成。 并不总是有效。比如几个月前刚刚scammed Ticketmaster by beating ReCAPTCHA的人*。 丑陋,要实现的代码更多,它将负担或责任从您转移到用户身上。 PROVE YOU ARE HUMAN 不是我在发送表单时想要看到的,非常侮辱。

@Nick 的想法是对的,使用文本/电子邮件验证。 IP检查有时可以,但正如您所说,您会获得具有相同手机号码的唯一IP,因此它不可靠。

这里有很多关于 CAPTCHA 替代品的精彩帖子,如果您打算使用它,绝对值得一读。您可能必须在方便用户(鼓励提交)和前端安全技术之间找到平衡。

但是,为什么不能简单地忽略重复的手机号码或电话号码 + IP 组合?仅仅因为他们可以提交多次并不意味着您必须接受它。如果是人类,让他们认为他们在发送多张选票:)

*Ticketmaster 使用了各种手段 试图阻止 Wiseguy 的行动, 在某一时刻切换到服务 叫reCaptcha,也用 脸书。这是第三方 提供验证码挑战的验证码 给网站的访问者。当客户 试图购票, Ticketmaster 的网络发送一个独特的 reCaptcha 的代码,然后 将验证码质询发送到 客户。

但据称被告是 也能够阻止这一点。他们 写了一个模拟用户的脚本 尝试访问 Facebook,以及 下载了几十万 可能的验证码挑战来自 reCaptcha,检察官坚持说。 他们确定了每个文件的文件 ID 验证码挑战并创建了一个 验证码“答案”数据库 对应每个ID。机器人会 然后识别一个的文件ID Ticketmaster 和 feed 的挑战 回对应的答案。机器人 还模仿了人类的行为 偶尔打字会出错 答案,当局说。

【讨论】:

无视选项是我目前倾向于使用的选项 - 就像您说的那样,它将责任归还给开发人员,而不是用户。它也不会告诉垃圾邮件发送者我们忽略了该条目,因此没有反馈可用于学习如何击败表单。 电子邮件/短信确认验证是唯一可靠的方法,但它对用户来说需要做更多的工作,并且可能会导致提交的工作量稍微减少,对您来说也需要做更多的工作 :) 实际上,这仍然没有不能解决人类多次提交的问题,因为他们可以多次确认。老实说,我认为答案中的最后一段是我会做的,似乎是最好的方法。您甚至可以选择是否要显示错误或错误的成功消息。 我刚想到的 1 个问题,但也许它是分裂的头发:如果有人使用我的电话号码提交垃圾邮件,那么我将无法发送“合法”提交。如果这是一个问题,您肯定需要通过确认来验证。 是的,如果用户禁用了 javascript,我想我会结合一些不太难的验证码进行验证后工作。我喜欢以某种方式使用手机号码进行验证的想法,但是您上面提到的问题需要解决。感谢您的帮助 (@everyone)。 @Blowski:感谢您的接受,但您一个小时前才问过这个问题,您不想让它打开以便更多人贡献吗?我认为这是一个很好的问题,并且这么早将其标记为已解决意味着它会受到较少的关注。如果某个专家决定顺路来怎么办? :)【参考方案3】:

验证码在垃圾邮件保护方面非常完美,但经常让人感到困惑。

但有一个解决方法 - 您可以使用 JavaScript 为真实用户隐藏验证码(使用打开 JavaScript 的浏览器),而对于垃圾邮件机器人(没有 JS)它始终是“可见的”。这很简单 - 只需使用 JS 您将保存验证码的 div 设置为 display:none,并创建一个隐藏输入,其值包含来自验证码图像的值...

最强的方法可能是电子邮件验证 - 但有时它意味着应用程序的重新编写。如果用户提交他的回复您将其注册为未激活并向他发送一封验证电子邮件到提供的电子邮件地址。如果有效,点击链接后,他将验证他的电子邮件回复,您可以将他的回复变为活动状态...

对于用户来说,防止在刷新时重新提交表单的一个很好的解决方法是在提交和处理表单后将用户重定向到同一页面...是的,查看结果需要一两秒钟的时间,但它更安全...

【讨论】:

这是我的想法之一。我在测试时使用 Selenium RC 来获取验证码,所以我知道这并非不可能。事实上,如果我能做到,那一定相当容易。 @Charliepiga:我不明白你的想法……也不明白你为什么不理解我。我们在我们所有的项目中都使用这种验证码的实现——人们不会对验证码感到恼火(当 JS 打开时),而当 JS 关闭时验证码就在那里...... JS 从 PHP 中获取验证码值并将其放入输入中值,然后隐藏所有验证码 div ... SPAM 机器人只是一个脚本(不能使用 JS),所以带有验证码的输入存在但值为空,因此在提交后您不会被垃圾邮件困扰...现在清除? “您可以使用 JavaScript 为真实用户隐藏验证码(使用打开 JavaScript 的浏览器),而对于垃圾邮件机器人(没有 JS)它始终是“可见的”” - 这是我不明白的部分。你是说因为所有机器人都没有启用 JS,所以你不应该显示启用了 JS 的验证码用户? 恭喜,你做对了。开发人员应该明白验证码对用户来说很烦人,有时它很难阅读,并且由于验证码错误,您最终可能会尝试提交表单一个小时......所以非常好的方法(当被说服使用验证码时无论如何)是为使用真实浏览器和 ofc 的真实用户隐藏验证码元素(虽然仍然存在于后面的某个地方)。开启 JS...

以上是关于有哪些技术可以防止多次提交比赛?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据

Jquery 实现表单提交按钮变灰,防止多次点击提交重复数据

jquery ajax如何防止多次提交

防止表单多次提交方法之二

防止按钮多次点击重复提交

$.ajax防止多次点击重复提交的方法