为CreateUserWizard添加“反机器人”增强功能

时间:2012-01-18 23:46:30

标签: asp.net asp.net-membership createuserwizard

我想在CreateUserWizard中添加一个“反机器人”问题,作为Captcha控件的一种更易接近的替代品。我对asp很新,发现我有点陷入WinForms思维模式。但是,我想出了一些似乎有用的东西。

标记:

    <asp:CreateUserWizard ID="CreateUserWizard1" runat="server">
    .
    .
    <tr>
      <td align="right">
        <asp:Label ID="AntiRobotQuestion" runat="server" AssociatedControlID="AntiRobotAnswer">
          Question:
        </asp:Label>
      </td>
      <td>
        <asp:TextBox ID="AntiRobotAnswer" runat="server"></asp:TextBox>
        <asp:RequiredFieldValidator ID="AntiRobotAnswerRequired" runat="server" ControlToValidate="AntiRobotAnswer" ErrorMessage="Answer is required." ToolTip="Answer is required." ValidationGroup="CreateUserWizard1">
        </asp:RequiredFieldValidator>
      </td>
    </tr>
    <tr>
      <td align="center" colspan="2" style="color:Red;">
        <asp:Literal ID="CustomErrorMessage" runat="server" Visible="False" EnableViewState="False"></asp:Literal>
      </td>
    </tr>
  .
  .
  </asp:CreateUserWizard>

代码背后:

protected void Page_Load(object sender, EventArgs e)
{

    if (!IsPostBack) {
        //Set up the Anti-Robot Question and Answer
        Label robotQuestion = (Label)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("AntiRobotQuestion");
        //Simulate randomly selecting a question and answer from a database table...
        robotQuestion.Text = "What is the capital of France";
        Session["AntiRobotAnswer"] = "Paris";
    }

}

protected void CreateUserWizard1_CreatingUser(object sender, LoginCancelEventArgs e)
{
    //Check the anti-robot Q & A
    TextBox robotAnswer = (TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("AntiRobotAnswer");
    if (robotAnswer.Text != (string)Session["AntiRobotAnswer"])
    {
        Literal errorMessage = (Literal)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("CustomErrorMessage");
        errorMessage.Text = "Wrong answer! Are you a robot?";
        errorMessage.Visible = true;
        e.Cancel = true;
    }

}

这是一种可接受的代码编码方式吗?对我来说,有两件事看起来有点“不整洁”:

  1. 使用FindControl取出对标记中控件的引用。
  2. 将预期答案存储在会话变量中。 (它有多安全?)
  3. 编辑(2012-01-23) 已经给出了一些有效的设计方案。但是,我有充分的理由使用这个问答技术(可能除了蜜罐的想法)。例如,与论坛主题相关的问题可以帮助防止人类垃圾邮件发送者以及僵尸程序。问题是:上面列出的代码是否可以接受这样做?来自WinForms的背景,它看起来有点笨拙 - 但也许这就是asp应该是什么样子。

1 个答案:

答案 0 :(得分:2)

正如我所说,我不喜欢你要求巴黎的想法。

  1. 最简单的方法是使用非可见字段并查看机器人是否用数据填充,蜜罐创意http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

  2. 您也可以使用asp.net工具包中的NoBot http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/NoBot/NoBot.aspx

  3. 此SO文章Practical non-image based CAPTCHA approaches?

  4. 还有许多其他想法