65.9K
CodeProject 正在变化。 阅读更多。
Home

为 Cuyahoga ContactUs 模块添加 CAPTCHA 支持

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (3投票s)

2010年9月30日

CPOL

2分钟阅读

viewsIcon

12660

在本文中,我将向您介绍将 reCAPTCHA 添加到 Cuyahoga ContactUs 模块的技巧。

PragmaTouch 产品 mTouchmTouch+ (Moodle 的原生 iOS 应用程序) 越来越受欢迎,我们通过“联系我们”页面收到大量的垃圾邮件。因此,使用某种形式的 CAPTCHA 是不可避免的,尽管我认为 CAPTCHA 对用户不友好。

在评估了一些 CAPTCHA 实现后,我决定将 reCAPTCHA 集成到我们的 Cuyahoga 驱动的网站中。以下是详细信息。

获取您网站的公共和私有密钥

您需要一个 Google 帐户才能创建公共/私有密钥以访问 reCAPTCHA 服务。登录 Google 后,转到 reCAPTCHA 网站管理员页面 并为您的网站创建密钥。

情况 #1:您没有 ContactUs 模块的源代码

  1. 下载 reCAPTCHA ASP.NET 库
  2. Recaptcha.dll 复制到 ~/bin 文件夹
  3. 在您的 ContactUs.ascx 文件顶部(位于 ~/Modules/ContactUs 文件夹下)插入以下代码
    <%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>
  4. reCAPTCHA 控件插入到位于 ~/Modules/ContactUs 文件夹下的 ContactUs.ascx 文件中。
     <recaptcha:RecaptchaControl
        ID="recaptcha"
        runat="server"
        PublicKey="your_public_key"
        PrivateKey="your_private_key" />
  5. 删除 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 模块的源代码

  1. 下载 reCAPTCHA ASP.NET 库
  2. Cuyahoga.Modules.ContactUs 项目中添加对 Recaptcha.dll 的引用
  3. 在您的 ContactUs.ascx 文件顶部(位于项目的 Web 文件夹下)插入以下代码
    <%@ Register TagPrefix="recaptcha" Namespace="Recaptcha" Assembly="Recaptcha" %>
  4. 将 reCAPTCHA 控件插入到位于项目 Web 文件夹下的 ContactUs.ascx 文件中
     <recaptcha:RecaptchaControl
        ID="recaptcha"
        runat="server"
        PublicKey="your_public_key"
        PrivateKey="your_private_key" />
  5. 删除 ContactUs.ascx 文件中所有 ASP.NET 控件的 ValidationGroup 属性。这是必需的,因为 reCAPTCHA ASP.NET 库与 ASP.NET 1.1 兼容,不支持验证组
  6. 修改 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;
          }
     }
  7. Cuyahoga.Modules.ContactUs.dll 复制到您网站的 ~/bin 目录
  8. ContactUs.ascx 复制到您网站的 ~/Modules/ContactUs 文件夹

请注意从第 24 行开始的 else 条件。我们修改了事件处理程序代码,以避免在页面无效的情况下向用户显示成功消息。

带有 reCAPTCHA 的 ContactUs 模块

这是我们启用了 reCAPTCHA 的 ContactUs 模块的屏幕截图。

contactus.PNG
© . All rights reserved.