如何保护注册页面免受多个恶意请求的侵害?

我允许用户使用注册表在我的网站上注册。 提交表单后,将生成令牌并通过电子邮件发送给用户,他们需要单击令牌链接以激活其帐户。

我的问题是,如果我这样做,恶意代码仍然可以发送多个电子邮件到我的网站进行注册,我应该使用Captcha来保护网站还是有其他方法?

如果您只想阻止双重提交 ,则可以为提交时检查的表单生成唯一标记。 如果每页有多个表单,这需要一些思考。 另外,一个简单的方法是在提交时禁用表单/按钮。 如果通过Ajax提交表单,则更有效(因此表单的操作参数可以不存在,因此不易收集)。

如果你想阻止自动提交(通过机器人) ,虽然Captcha可能是常用方法中最强大的,但它也是非常用户敌意的。 相反,除非你有理由相信你的网站是专门针对的,否则通常只需使用蜜jar字段(人类永远不会填充的隐形字段,但机器人会这样做)和隐藏的字段,你填充已知的使用JS后短暂延迟后的值(机器人通常不会执行JS,也不会花时间键入像人类这样的字段)。 简单地做Ajax提交通常就足够了。 我建议在回到Captcha之前使用这些方法中的一种或混合物。

validation码是标准方法之一。

另一种方法是不要直接提交表单。使用AJAXfied服务器调用sos表单不会自行发布,但有一些数据扰乱内部字段并延迟提交。

$("#contactForm").submit(function(event) { /* stop form from submitting normally */ event.preventDefault(); /* get some values from elements on the page: */ var $form = $( this ), $submit = $form.find( 'button[type="submit"]' ), name_value = $form.find( 'input[name="name"]' ).val(), email_value = $form.find( 'input[name="email"]' ).val(), phone_value = $form.find( 'input[name="phone"]' ).val(), message_value = $form.find( 'textarea[name="message"]' ).val(); /* Send the data using post */ var posting = $.post( "contact-form-handler.php", { name: name_value, email: email_value, phone: phone_value, message: message_value }); posting.done(function( data ) { /* Put the results in a div */ $( "#contactResponse" ).html(data); /* Change the button text. */ $submit.text('Sent, Thank you'); /* Disable the button. */ $submit.attr("disabled", true); }); }); 

我不是这方面的专家,但对我来说这个解决方案似乎很明显:

每个人都使用CAPTCHA。 没有其他方法可以保护您的服务器免受自动攻击。 它不会让你免于DDoS,但会处理其他所有事情,因为CAPTCHA就是CAPTCHA 。

您可以使用多种CAPTCHA解决方案,因此请选择最适合您的解决方案。

正如Velis所说,最简单的方法是使用Captcha。

存在其他解决方案,但如果机器人是您的网站的目标,可以轻松打败,例如,有一个隐藏的字段,如“重新输入电子邮件”,将由机器人填充,但可以在服务器端捕获,注册可以被拒绝。

还存在某些复杂的方法,例如记录鼠标点击或填写表单所需的时间,但这些方法需要大量的JS工作,并且在您的网站成为机器人目标之前可能会过度杀伤。

validation码是一种合理的解决方案,但大多数人都不喜欢它。 相反,如果你为你的系统添加一些智能? 在电子邮件之间实施冷却时间。 在发送电子邮件之前,请等一分钟。 如果有其他电子邮件请求,请等待另一分钟,不要发送第一个。 (这可能是另一种forms的攻击,但只有这是唯一的防线)。 一个人会在最后一分钟尝试注册30次吗? 不会。如果最后一个注册成功,一个人会重新注册吗? 不可以。您还可以将这些与注册用户的IP结合使用:用户是否会尝试在10分钟内为来自同一IP的其他用户创建10个新帐户? 不太可能。

如果这是一个公司网站,你必须防止垃圾邮件,那么考虑第二种沟通方式。 例如,如果您有方法,则可以请求用户将电子邮件地址发送到特定号码,这将创建重置密码请求。

您还可以在用户完成注册后生成应该用于检索帐户的数字列表。 类似于:“如果您的帐户丢失,可以通过在RETRIEVE字段中输入其中一个号码来检索”然后提供一个对您的公司和客户保密的号码列表。 谷歌也是这样做的。

虽然这些机制可能变得复杂,但它们比任何validation码更聪明; 将更容易适应,更全面。 从好的方面来说,您的用户会感谢您不必阅读扭曲的数字和字母图像。