为 Cuyahoga ContactUs 模块添加 CAPTCHA 支持
在本文中,我将向您介绍将 reCAPTCHA 添加到 Cuyahoga ContactUs 模块的技巧。
PragmaTouch 产品 mTouch 和 mTouch+ (Moodle 的原生 iOS 应用程序) 越来越受欢迎,我们通过“联系我们”页面收到大量的垃圾邮件。因此,使用某种形式的 CAPTCHA 是不可避免的,尽管我认为 CAPTCHA 对用户不友好。
在评估了一些 CAPTCHA 实现后,我决定将 reCAPTCHA 集成到我们的 Cuyahoga 驱动的网站中。以下是详细信息。
获取您网站的公共和私有密钥
您需要一个 Google 帐户才能创建公共/私有密钥以访问 reCAPTCHA 服务。登录 Google 后,转到 reCAPTCHA 网站管理员页面 并为您的网站创建密钥。
情况 #1:您没有 ContactUs 模块的源代码
- 下载 reCAPTCHA ASP.NET 库
- 将 Recaptcha.dll 复制到 ~/bin 文件夹
- 在您的 ContactUs.ascx 文件顶部(位于 ~/Modules/ContactUs 文件夹下)插入以下代码
<%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>
- 将
reCAPTCHA
控件插入到位于 ~/Modules/ContactUs 文件夹下的 ContactUs.ascx 文件中。<recaptcha:RecaptchaControl ID="recaptcha" runat="server" PublicKey="your_public_key" PrivateKey="your_private_key" />
- 删除 ContactUs.ascx 文件中所有 ASP.NET 控件的
ValidationGroup
属性。这是必需的,因为 reCAPTCHA ASP.NET 库与 ASP.NET 1.1 兼容,不支持验证组。
这种情况只有一个缺点。即使他们无法发送电子邮件,您的用户也会看到成功消息。这是因为 ContactUs 模块的开发者更喜欢显示成功消息,即使页面无效。以下是代码
private void btnSend_Click(object sender, System.EventArgs e)
{
// Send email
if (this.Page.IsValid)
{
try
{
Site site = base.PageEngine.ActiveNode.Site;
_module.Send(this.lstSendto.SelectedValue, site.WebmasterEmail,
this.txtSubject.Text,
String.Format("To: {0}\r\nFrom: {1}\r\nName: {2}\r\n{3}",
this.lstSendto.SelectedItem.Text, this.txtFromemail.Text,
this.txtFromname.Text, this.txtMessage.Text));
}
catch
{
this.lblSendError.Text = base.GetText("FAILDTOSEND");
this.lblSendError.Visible = true;
}
}
this.pnlContactus.Visible = false;
this.pnlMailsend.Visible = true;
this.lblMailsend.Text = String.Format(base.GetText("MAILSENDOK"),
this.txtFromname.Text);
}
请注意第 21-23 行。如您所见,无论 Page.IsValid == true
如何,都会发送成功消息。
情况 #2:您拥有 ContactUs 模块的源代码
- 下载 reCAPTCHA ASP.NET 库
- 在
Cuyahoga.Modules.ContactUs
项目中添加对 Recaptcha.dll 的引用 - 在您的 ContactUs.ascx 文件顶部(位于项目的 Web 文件夹下)插入以下代码
<%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>
- 将 reCAPTCHA 控件插入到位于项目 Web 文件夹下的 ContactUs.ascx 文件中
<recaptcha:RecaptchaControl ID="recaptcha" runat="server" PublicKey="your_public_key" PrivateKey="your_private_key" />
- 删除 ContactUs.ascx 文件中所有 ASP.NET 控件的
ValidationGroup
属性。这是必需的,因为 reCAPTCHA ASP.NET 库与 ASP.NET 1.1 兼容,不支持验证组 - 修改 ContactUs.ascx.cs 文件中找到的
btnSend_Click
代码块
private void btnSend_Click(object sender, System.EventArgs e) { // Send email if (this.Page.IsValid) { try { Site site = base.PageEngine.ActiveNode.Site; _module.Send(this.lstSendto.SelectedValue, site.WebmasterEmail, this.txtSubject.Text, String.Format("To: {0}\r\nFrom: {1}\r\nName: {2}\r\n{3}", this.lstSendto.SelectedItem.Text, this.txtFromemail.Text, this.txtFromname.Text, this.txtMessage.Text)); this.pnlContactus.Visible = false; this.pnlMailsend.Visible = true; this.lblMailsend.Text = String.Format(base.GetText("MAILSENDOK"), this.txtFromname.Text); } catch { this.lblSendError.Text = base.GetText("FAILDTOSEND"); this.lblSendError.Visible = true; } } else { this.lblSendError.Text = "ERROR: Check if all required fields has data and you typed the words displayed in the image below correctly."; this.lblSendError.Visible = true; } }
- 将 Cuyahoga.Modules.ContactUs.dll 复制到您网站的 ~/bin 目录
- 将 ContactUs.ascx 复制到您网站的 ~/Modules/ContactUs 文件夹
请注意从第 24 行开始的 else
条件。我们修改了事件处理程序代码,以避免在页面无效的情况下向用户显示成功消息。
带有 reCAPTCHA 的 ContactUs 模块
这是我们启用了 reCAPTCHA 的 ContactUs 模块的屏幕截图。
