ASP.NET成员身份未经确认的用户帐户

时间:2015-09-24 20:43:57

标签: asp.net-mvc asp.net-membership membership-provider

我正在编写一个ASP.NET MVC应用程序,它使用Membership数据库来存储用户注册。我使用电子邮件地址作为用户名。当用户在我的应用程序中注册时,我会向注册时使用的地址发送电子邮件确认。即我发送一封包含用户应该点击的链接的电子邮件,以验证该地址属于他。

在点击该链接之前,该帐户仍然是“未经证实的”#39; (即EmailConfirmed列等于False)。这意味着,帐户已创建,但尚未激活。

如何处理蛮力创建帐户的黑客?我在这里看到两个大问题:

  1. 会员数据库的规模不断扩大。单个用户,来自 一台计算机不是威胁,但如果他有一个僵尸' 计算机?
  2. 如果User1使用User2@example.com电子邮件和帐户创建帐户 User2忽略激活电子邮件,该帐户将基本上 保持锁定(未经证实),但存在。如果User2稍后决定 实际创建一个帐户,他们无法使用他们的电子邮件进行注册 (帐户已存在),他们也无法重置密码 - 因为即使他们重置密码,也不一定 激活帐户。
  3. 至于2)我看到了几个选项:

    1. 设置未确认帐户的到期日期 - 即如果电子邮件未经24小时确认,则允许再次申请用户名/电子邮件
    2. 修改我的重置密码方法以激活帐户(如果尚未激活)。这是一个好主意吗?我的意思是,如果他们点击其中的重置密码链接,该人将收到一封电子邮件,这实际上是一个确认。 还有什么吗?
    3. 1)怎么样?如何保护自己免受批量创建帐户的影响?除了使用代码限制每个IP每天1个帐户。

1 个答案:

答案 0 :(得分:0)

处理这类问题的一种简单方法是粗略但有效。

我通常会在表单中添加一个不属于我需要的字段的附加字段 - 但是有一个合法的名字,如“公司” - 然后我使用CSS将其隐藏在屏幕视图中。真实用户永远不会在屏幕上看到这个,但是浏览HTML的机器人会找到它。

然后,在提交表单时,首先我检查该表单字段是否有值。如果它有 - 我停止页面执行任何进一步或只是返回HTTP错误,因为99.9%的时间只有机器人会填写该字段 - 而不是真正的用户。

 //anti-bot measure
    if (!String.IsNullOrEmpty(Company.Text))
        {
         HttpContext.Current.Response.StatusCode = 400;
         HttpContext.Current.Response.Status = "400 Bad Request";
         HttpContext.Current.Response.End();
    }

//carry on processing the form...

我已经在表格上使用这种技术已经有好几年了,而且非常有效!