Добавление усовершенствования «анти-робот» в CreateUserWizard - PullRequest
3 голосов
/ 19 января 2012

Я хочу добавить «анти-робот» вопрос в CreateUserWizard как более доступную альтернативу элементу управления Captcha. Я довольно новичок в asp и обнаружил, что немного застрял в мышлении WinForms. Однако я придумала что-то, что, кажется, работает.

Markup:

    <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. Сохранение ожидаемого ответа в переменной сеанса. (Насколько это безопасно?)

РЕДАКТИРОВАТЬ (2012-01-23) Некоторые действительные варианты дизайна были предоставлены. Однако у меня есть веская причина использовать этот метод вопросов и ответов (возможно, в дополнение к идее приманки). Например, вопрос, относящийся к теме форума, может помочь предотвратить спамеров, а также ботов. Вопрос в том, является ли приведенный выше код приемлемым способом сделать это? Исходя из фона WinForms, мне это кажется немного неуклюжим, но, возможно, именно так должен выглядеть asp.

1 Ответ

2 голосов
/ 20 января 2012

Как я уже сказал, мне не нравится, что вы просите Париж.

  1. Самый простой способ - использовать невидимое поле и посмотреть, не заполнит ли его ботданные, идея honeypot http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx

  2. также вы можете использовать NoBot из набора инструментов asp.net http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/NoBot/NoBot.aspx

  3. Есть много других идей по этой статье SO Практические подходы CAPTCHA, не основанные на изображениях?

...