Java 如何保护注册页面不受多个恶意请求的影响?

Java 如何保护注册页面不受多个恶意请求的影响?,java,spring-security,captcha,Java,Spring Security,Captcha,我允许用户使用注册表在我的网站上注册。 提交表单后,将生成令牌并通过电子邮件发送给用户,用户需要单击令牌链接以激活其帐户 我的问题是,如果我这样做,恶意代码是否仍然可以发送多封电子邮件到我的网站进行注册,我应该使用Captcha保护网站还是有其他方法?我不是这方面的专家,但解决方案对我来说似乎相当明显: 每个人都使用验证码。没有其他方法可以保护您的服务器免受自动攻击。它不会将您从DDoS中解救出来,但会处理几乎所有其他事情,因为验证码是 不过,您确实有多种验证码解决方案,所以请选择一种最适合您的

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


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

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

每个人都使用验证码。没有其他方法可以保护您的服务器免受自动攻击。它不会将您从DDoS中解救出来,但会处理几乎所有其他事情,因为验证码是


不过,您确实有多种验证码解决方案,所以请选择一种最适合您的解决方案。

正如Velis所提到的,最简单的方法就是使用验证码

其他解决方案也存在,但如果您的网站以机器人为目标,则很容易被击败,例如,有一个隐藏字段,如“重新输入电子邮件”,该字段将由机器人填充,但可以在服务器端捕获,注册可能会被拒绝


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

验证码是标准方法之一

另一种方法是不要直接提交表单。使用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>
$(“#联系人表单”).submit(函数(事件)
{
/*阻止表单正常提交*/
event.preventDefault();
/*从页面上的元素获取一些值:*/
var$form=$(此),
$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();
/*使用post发送数据*/
var posting=$.post(“联系表单处理程序.php”,{
name:name_值,
email:email_值,
phone:phone_值,
消息:消息值
});
过帐.完成(功能(数据)
{
/*将结果放入div中*/
$(“#contactResponse”).html(数据);
/*更改按钮文本*/
$submit.text('Sent,谢谢');
/*禁用按钮*/
$submit.attr(“已禁用”,true);
});
});

如果您只想防止重复提交,您可以为提交时检查的表单生成唯一的令牌。如果每页有多个表单,则需要考虑这一点。另外,一个简单的方法是在提交时禁用表单/按钮。如果表单是通过Ajax提交的(因此表单的action参数可能不存在,因此不容易获取),那么这将更加有效


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

验证码是一种可行的解决方案,但大多数人不喜欢它。 如果你给你的系统增加了一些智能,怎么样? 在两封电子邮件之间进行冷却。在发送电子邮件之前,请等待一分钟。如果收到另一封电子邮件请求,请再等待一分钟,不要发送第一封。(这可能是另一种形式的攻击,但前提是这是唯一的防线)。 一个人会在最后一分钟尝试注册30次吗?不会。 如果最后一次注册成功,一个人会重新注册吗?不会。 您还可以将这些与注册用户的IP结合起来:用户是否会尝试在10分钟内从同一IP为其他用户创建10个新帐户?不太可能

如果这是一个公司网站,你必须防止电子邮件垃圾邮件,然后考虑次要的通信方式。例如,如果你有这个手段,你可以请求用户把电子邮件地址发送到一个特定的号码,这将产生一个重置密码请求。 用户完成注册后,您还可以生成一个用于检索帐户的号码列表。例如:“如果您的帐户丢失,可以通过在检索字段中输入其中一个号码来检索”然后提供一份对你的公司和客户保密的数字清单,就像谷歌一样


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

您自己实现了所有“注册”流和“忘记密码”等吗?我已经写过了(java,关于Spring安全性)一个开源项目可以做到这一点。看看:。@OhadR,太糟糕了,我转向了Java EE框架。如果它不使用Spring安全性就可以工作,那就太好了。顺便说一下,我只使用Java EE解决方案做了同样的事。你能给我一个AJAXfield服务器调用方法的例子吗?这是javascript/JQueryen,尽管我同意关于验证码对用户不友好(我甚至不会称之为恶意),peo