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

时间:2014-04-17 00:31:32

标签: java spring-security captcha

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

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

验证码是标准方法之一。

另一种方法是不要直接提交表单。使用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);
     });
});</script>

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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

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

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