ASP.NET 控件以防止自动注册僵尸程序

分享于 

12分钟阅读

Web开发

  繁體

介绍

AntiAuto是一组可以在 ASP.NET Web窗体上使用的控件,以防止自动注册"from"。 最近我在休息室提到过,我认为这将是 ASP.NET's 上级应用程序架构的一个好例子。

许多站点需要用户在给定完全访问权限之前进入 register。 例如 Hotmail.com 要求你输入一些基本的细节,以便向你提供电子邮件地址。 然而,这种服务是开放的。自动生成用于发送垃圾邮件的许多电子邮件地址。

为了防止此类滥用,许多站点要求用户输入图片--中显示的代码,从而强制用户输入注册细节。

目的是生成一组可以轻松部署的ASP.NET,并且适合现有的注册过程。

解决方案概述

为了概述项目中的类,这里有一个快速的UML类图。

CodeImageCodeImageValidator的重要类。 Util 是一个支持类,提供了各种其他组件所需要的加密和解密功能。

CodeImage

此类的用途是在将显示图像的网页窗体上生成 HTML。 图像本身由 DrawImage.aspx 文件生成,而文件又使用 PictureGenerator 类。

CodeImageValidator

这个 BaseValidator 派生类验证关联文本框( ControlToValidate )的内容是否与 CodeImage 控件( CodeImageControl ) 中所绘制的内容匹配。

如何共同工作

当一个页面首次加载一个随机数时,它将作为查询字符串的一部分传递到 DrawImage.aspx 页面。 这里数字在发生的所有回发中保留在视图中。 在 postback 期间,验证控制( CodeImageValidator ) 用于确保表单能够成功地验证。

.有关实现的详细信息

CodeImage

CodeImageCodeImage.cs 文件中实现。 控件的目的是输出必要的HTML代码来绘制图像。 例如如果 DrawImage.aspx 页面要绘制图片,HTML输出看起来就像:

<imgsrc="DrawImage.aspx?code=12345">

整个类的代码如下所示:

publicclass CodeImage : Control
{
 privatestring _key;
 privateint _digits;
 public CodeImage()
 {
 _key = System.Configuration.ConfigurationSettings.AppSettings["EncryptionKey"];
 _digits = Int32.Parse(System.Configuration.ConfigurationSettings.AppSettings["Digits"]);
 }
 publicstring Code
 {
 get {
 return (string)ViewState["SecretCode"];
 }
 set {
 ViewState["SecretCode"] = value;
 }
 }
 protectedoverridevoid Render(HtmlTextWriter output)
 {
 output.Write( String.Format("<img src="DrawImage.aspx?code={0}">", 
 HttpUtility.UrlEncode(Code)));
 }
 protectedoverridevoid OnLoad(System.EventArgs e)
 {
 if (!this.Page.IsPostBack)
 {
 StringBuilder sbCode = new StringBuilder(_digits,_digits);
 Random R = new Random();
 int i;
 int MaxLimit = 9;
 for(i = 0; i < _digits; i++)
 {
 sbCode.Append(R.Next(MaxLimit));
 }
 Code = Util.EncryptString(sbCode.ToString(),_key);
 }
 }
}

它是非常简单的代码,在构造函数中加载了几个配置设置。 这些是跨各种控件和页面使用的,所以使用 web.config 配置文件是最好的方法。

重写方法将重写HTML代码,要在图片中显示的安全代码来自 Code 属性。 在 QueryString 代码中,使用代码对数字进行加密是非常必要的,因此,在 Util 类中,EncryptString 方法是由方法执行的,而不是使用 code=12345. 当 PictureGenerator 类被要求渲染图像时,它会被类解密。

重要的是要注意,加密的安全代码首先是 UrlEncode,确保任何无效字符都可以安全地进入 QueryString。 同样,这些是 UrlDecode的另一边( 在 DrawImage.aspx 内)。

如果首次加载页面时,OnLoad 事件用于生成随机数( 例如。 不在回发中)。 生成安全代码后,它存储在 Code 属性中,然后将它的存储在 ViewState ( 因此允许跨回发保留内容) 中。

CodeImage 控件将直接放入 ASP.NET Web窗体,以及在文章后面的代码中包含的代码。

CodeImageValidator

此类在 CodeImageValidator.cs 文件中实现,用于检查关联的文本框的内容是否与 CodeImage 控件生成的代码匹配。

同样,代码相对简单,因此在讨论之前,这里是整个类实现:

publicclass CodeImageValidator : BaseValidator
{
 TextBox _codeTextBox;
 string _codeImageId;
 CodeImage _codeImageControl;
 string _key;
 public CodeImageValidator()
 {
 _key = System.Configuration.ConfigurationSettings.AppSettings["EncryptionKey"];
 }
 protectedoverridebool ControlPropertiesValid()
 {
 // Should have a text box control to check Control ctrl = FindControl(ControlToValidate);
 Control imageControl = FindControl(_codeImageId);
 if ( (null!= ctrl) && (null!= imageControl) )
 {
 if ((ctrl is System.Web.UI.WebControls.TextBox) &&
 (imageControl is CodeImage))
 {
 _codeTextBox = (System.Web.UI.WebControls.TextBox) ctrl;
 _codeImageControl = (CodeImage) imageControl;
 return ( (null!= _codeTextBox) && (null!= _codeImageControl) );
 } 
 elsereturnfalse;
 }
 elsereturnfalse;
 }
 publicstring CodeImageControl
 {
 get {
 return _codeImageId;
 }
 set {
 _codeImageId = value;
 }
 }
 protectedoverridebool EvaluateIsValid()
 {
 return (Util.DecryptString(_codeImageControl.Code,_key) == 
 _codeTextBox.Text);
 }
}

CodeImageValidator 派生自 BaseValidator,因此预期将表现为任何其他验证控件。 它需要重写在提交表单时调用的EvaluateIsValid 方法。

ControlPropertiesValid 方法用于获取对验证--中使用的控件的引用,TextBoxCodeImage 控件。 然后在 ctrlimageControl 字段中维护这些引用。 CodeImageValidator 控件的两个属性用于在ASPX页,ControlToValidateCodeImageControl 中设置这些属性。

CodeImage 控件有一个属性( Code ),它的中包含要输入文本框的加密安全代码。 然后在 EvaluateIsValid 方法中进行解密,并与框的文本内容进行比较。 如果匹配,则验证将成功,并且该方法可以 return true。

DrawImage.aspx

DrawImage页面用于生成要发送到浏览器的JPEG流并使用 PictureGenerator 类。 DrawImage 页的代码如下所示:

<%@PageLanguage="C#"ContentType="image/jpeg"%><scriptlanguage="C#"runat="server">void Page_Load (Object sender, EventArgs e)
 {
 // Draw the output Etier.AntiAuto.PictureGenerator.OutputPicture( this, 
 HttpUtility.UrlDecode(Request.QueryString["code"]) );
 }</script>

首先将 ContentType 设置为图像/jpeg (。确保浏览器将内容呈现为图像,而不是HTML页或者任何其他类型)。 调用 OutputPicture 方法,传递对当前页的引用以及要呈现的加密安全代码。

OutputPicture 方法的代码如下所示:

publicstaticvoid OutputPicture(System.Web.UI.Page page, string encryptedCode)
{
 page.Response.Clear();
 string key = System.Configuration.ConfigurationSettings.AppSettings["EncryptionKey"];
 int digits = Int32.Parse(System.Configuration.ConfigurationSettings.AppSettings["Digits"]);
 Bitmap codeBitmap = new Bitmap((digits*16)+20,26, PixelFormat.Format24bppRgb);
 Graphics g = Graphics.FromImage(codeBitmap); 
 g.SmoothingMode = SmoothingMode.AntiAlias;
 g.Clear(Color.Orange);
 g.DrawString( Util.DecryptString(encryptedCode,key), new Font("Arial", 16,
 FontStyle.Bold ), SystemBrushes.WindowText, new Point(10,2));
 codeBitmap.Save( page.Response.OutputStream, ImageFormat.Jpeg);
 g.Dispose();
 codeBitmap.Dispose();
 page.Response.End();
}

代码基于CodeProject上的Nick"网络图形的在 ASP.NET。"文章。 它加载配置设置,然后呈现映像,首先解密安全代码。 安全代码取自 drawimage,并由控件加密,以防止访问者确定渲染图片之外的安全代码。

如何使用它

演示应用程序包括一个ready-to-deploy示例,但是有一些事情需要对现有 ASP.NET Web表单执行:

  • 将AntiAuto程序集复制到应用程序目录的/bin
    将 Web.Config 配置文件复制到应用程序的root
    将 DrawImage.aspx 复制到包含Web窗体的同一目录中
  • 将导入命令添加到网页窗体的顶部:
<%@RegisterTagPrefix="etier"Namespace="Etier.AntiAuto"Assembly="AntiAuto"%>
这将命名空间映射到标记前缀,这样你就可以 <prefix:ControlClass的形式添加控件。
  • CodeImage 控件添加到web窗体中:
<etier:CodeImage
 ID="codeImageControl" RunAt="server"/>
在运行时产生 <src="。"> HTML代码来生成图像。
  • CodeImageValidator 控件添加到web窗体中:
<etier:CodeImageValidator
 ID="codeImageValidator" ControlToValidate="codeTextBox" CodeImageControl="codeImageControl" ErrorMessage="Please enter the text in the image" Display="Static" RunAt="server"/>
ControlToValidateCodeImageControl 设置为向 TextBoxCodeImage 控件提供的id是很重要的。

结束语

这些控件非常简单,并且演示了 ASP.NET's 新架构是多么的华丽。 我希望人们发现它有用,并改进它。 对于代码中不包含许多( 如果有的话) 注释,但是由于本文介绍了它所有的工作原理,应该相对理解。 当我重新讨论解决方案时,我一定要做一个单独的控件,这样部署就更容易了。

如果有任何问题或者评论,请随时发邮件或者发邮件给我。


控制  AUTO  asp  asp-net  PRE  Controls  
相关文章