我想在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;
}
}
这是一种可接受的代码编码方式吗?对我来说,有两件事看起来有点“不整洁”:
编辑(2012-01-23) 已经给出了一些有效的设计方案。但是,我有充分的理由使用这个问答技术(可能除了蜜罐的想法)。例如,与论坛主题相关的问题可以帮助防止人类垃圾邮件发送者以及僵尸程序。问题是:上面列出的代码是否可以接受这样做?来自WinForms的背景,它看起来有点笨拙 - 但也许这就是asp应该是什么样子。
答案 0 :(得分:2)
正如我所说,我不喜欢你要求巴黎的想法。
最简单的方法是使用非可见字段并查看机器人是否用数据填充,蜜罐创意http://haacked.com/archive/2007/09/11/honeypot-captcha.aspx
您也可以使用asp.net工具包中的NoBot http://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/NoBot/NoBot.aspx