用于 ASP.NET的验证服务器控件

分享于 

12分钟阅读

Web开发

  繁體

A CAPTCHA control implemented as a simple, drag-and-drop ASP.NET Server Control

介绍

我相信大家都很熟悉垃圾邮件。 在对付垃圾邮件时,有两种想法:

这两种方法都有各自的优点和缺点。 本文将只处理第二种技术: 验证你接收的数据是来自一个实际人,而不是一个机器人或者脚本。 一个验证是测试输入的一种方法,以确保你处理一个人。 现在,我们已经在本主题的MSDN文章中介绍了构建CAPTCHA的很多方法,但是我将重点介绍可视化数据输入验证工具。

这里已经有一个关于CAPTCHA控件的优秀 ASP.NET 文章,因此你可能想知道本文的内容是什么。 出于以下原因,我希望重新生成该解决方案:

  • 更多控制设置和灵活性
  • 转换为我首选的VB.Net 语言
  • 摘要为 blown 的ASP.NET 服务器控制

因这里,本文将将如何将一组现有的ASP.NET 网页转换成一个简单。拖放 ASP.NET 服务器控制 --。

实现

我首先要处理的是CAPTCHA类生成的图像。 这最初是用专用的 (。) 来完成的,它将不存在服务器控件中的内容。 我如何能在飞行中生成图像? 经过研究,我向世界介绍了和 HttpHandlers。 它们是非常强大的--,一个 HttpHandler 可以很好地解决这个问题。

我们需要的只是一个小的Web.config 在 <system.web> 部分修改:

<httpHandlers><addverb="GET"path="CaptchaImage.aspx"type="WebControlCaptcha.CaptchaImageHandler, WebControlCaptcha"/></httpHandlers>

这个处理程序定义一个名为 CaptchaImage.aspx的特殊页面。 这个"页面"并不存在。 当请求 CaptchaImage.aspx 时,它将被实现 IHttpHandler 接口的类截获并处理: CaptchaImageHandler。下面是相关的代码部分:

PublicSub ProcessRequest(ByVal context As System.Web.HttpContext) _
 Implements System.Web.IHttpHandler.ProcessRequest
 Dim app As HttpApplication = context.ApplicationInstance
 '-- get the unique GUID of the captcha;' this must be passed in via querystringDim strGuid AsString = Convert.ToString(app.Request.QueryString("guid"))
 Dim ci As CaptchaImage
 If strGuid = ""Then'-- mostly for display purposes when in design mode'-- builds a CAPTCHA image with all default settings '-- (this won't reflect any design time changes) ci = New CaptchaImage
 Else'-- get the CAPTCHA from the ASP.NET cache by GUID ci = CType(app.Context.Cache(strGuid), CaptchaImage)
 app.Context.Cache.Remove(strGuid)
 EndIf'-- write the image to the HTTP output stream as an array of bytes ci.Image.Save(app.Context.Response.OutputStream, _
 Drawing.Imaging.ImageFormat.Jpeg)
 '-- let the browser know we are sending an image,'-- and that things are 200 A-OK app.Response.ContentType = "image/jpeg" app.Response.StatusCode = 200 app.Response.End()EndSub

将生成一个新的CAPTCHA图像,图像直接从内存流到浏览器。 解决问题 !

但是,还有另外一个问题:负责显示图像的HttpHandler 之间有通信,而承载控制--的网页,否则调用控件会知道随机生成的验证码是什么? 如果在呈现控件上查看源,则会看到通过 QueryString 传递了一个 GUID:

<imgsrc="CaptchaImage.aspx?guid=99fecb18-ba00-4b60-9783-37225179a704"border='0'>

这个 GUID ( 全局唯一标识符) 是用来访问最初存储在 ASP.NET 缓存中的验证器对象的密钥。 查看 CaptchaControl.GenerateNewCaptcha 方法:

PrivateSub GenerateNewCaptcha()
 LocalGuid = Guid.NewGuid.ToString
 IfNot IsDesignMode Then HttpContext.Current.Cache.Add(LocalGuid, _captcha, Nothing, _
 DateTime.Now.AddSeconds(HttpContext.Current.Session.Timeout), _
 TimeSpan.Zero, Caching.CacheItemPriority.NotRemovable, Nothing)
 EndIfMe.CaptchaText = _captcha.Text
 Me.GeneratedAt = NowEndSub

这看起来有点奇怪,但效果很好。 ASP.NET 事件的顺序如下:

  • 页面已经呈现。
  • 这里页面将生成一个新的GUID和一个新的CAPTCHA对象,该对象反映了控件属性。 生成的CAPTCHA对象通过GUID存储在缓存中。
  • 页面调用 CaptchaControl1.Render ;特殊 <> 标记URL被写入浏览器。
  • 浏览器尝试检索特殊 <> 标记 URL。
  • CaptchaImageHandler.ProcessRequest 激发。它从 QueryString 检索从中获得的GUID,从高速缓存中获取,并呈现。 然后移除缓存对象。

请注意,在最后会涉及到一些清理。 如果某种原因,控件呈现但从未检索到图像 URL,在缓存中会有一个孤立的in对象。 这可能发生,但在practice--中应该很少,而且我们的缓存条目只有 20分钟的时间。

我早期犯的一个错误是在ViewState中存储实际的CAPTCHA文本。 视图不加密,可以轻松地进行解码 ! 然而,我已经切换到了GUID的GUID,这对于从缓存--检索共享的Captcha控件非常重要,但是它本身就是无用的。

CaptchaControl属性

CaptchaControl 是一个好的ASP.NET 公民,并且实现所有默认 ASP.NET 服务器控件属性。 它还具有自己的几个属性:

CAPTCHA control properties

属性默认描述
CacheStrategyHttpRuntime出于安全原因,CAPTCHA文本永远不会发送到客户端;它只存储在服务器上。 它可以存储在 Session ( 网络场友好) 或者 HttpRuntime ( 非常快但是本地的网络服务器) 中。
CaptchaBackgroundNoiseLow添加到验证码图像中的background 噪声的数量。 从 NoneExtreme的范围。
CaptchaChars一个z,1 -9构建验证码文本时要使用的字符白名单。 一个字符将从这个字符串随机选取。 默认情况下,我省略一些可能混淆的字符,例如 0,I,1,8,B,等等。
CaptchaFont""用于验证码文本的font-family。 如果未提供,将为每个字符选择随机安装的字体。 在内部维护字体白名单,所以只有已经知的字体才能使用(。比如,不是 WingDings )。
CaptchaFontWarpingLowCAPTCHA文本的每个字符上使用的翘曲级别。 从 NoneExtreme的范围。
CaptchaHeight50验证码图像的默认高度,以像素为单位。
CaptchaLength5随机生成的验证码文本中使用的字符数。
CaptchaLineNoiseNone添加到验证码图像中的"涂鸦"行噪声量。 从 NoneExtreme的范围。
CaptchaMaxTimeout90°旋转速度验证码在生成后保持有效并存储在缓存中的秒数。
CaptchaMinTimeout3用户输入验证码前必须等待的最小秒数。
CaptchaWidth180验证码图像的默认宽度,以像素为单位。
UserValidatedFalse在 postback 之后,返回 True 如果用户输入的文本与随机生成的验证码文本相匹配。 请注意,标准 IValidation 接口也实现了。
LayoutStyle水平确定文本和输入框是否位于右侧,或者是 below。 允许更大的布局灵活性。

这些属性中的许多都与人类可读性和机器可读性之间的内在平衡有关。 对于OCR软件来说,数字识别器的难度就越大,对于我们人类来说,它就越难。 的illustration,比较这两个CAPTCHA图像:

左侧的CAPTCHA是用所有的"介质"设置生成的,这是人类可读性和OCR机器可读性之间的一。 右边的CAPTCHA使用了较低的CaptchaFontWarping 和较小的CaptchaLength。 如果某人编写OCR脚本的风险来失败你的验证码,我强烈希望你使用easier-to-read码设置。 记住,只要有一个CAPTCHA就会很高。

后来添加了 CaptchaTimeout 属性,以减轻对验证码场的关注。 如果用户解决了密码码,就可以通过显示验证码,并为用户提供免费的mp3或者色情信息,从而解决获取验证码的可能性。 但是,这种技术需要时间,如果验证码有时间限制,则它无法工作。

结束语

很多感谢BrainJar创建他的简单但有效的验证图像类。 现在我已经将它包装到了 ASP.NET 服务器控件中,它应该比以前简单地拖放web表单。

在本文提供的演示解决方案中,有许多详细信息和注释,所以请检查一下。 而且,请不要犹豫,提供反馈,好或者坏 ! 我希望你喜欢这篇文章。 如果你愿意的话,你也可以喜欢我的其他文章,也可以。

历史记录

  • 星期一 8 Published Published。
  • 2004年12月17日
  • 添加了 UserValidationEvent
  • 更改默认为不那么激进( 更多用户友好)
  • 添加了 LayoutStyle 属性以选择水平或者垂直布局
  • 更改了从黑名单到白名单的随机字体方法
  • 修正了 Robert Sindall报告的间歇性 order-of-retrieval Bug
  • 转换为 VB.Net 2005兼容的XML注释
  • 星期 Sunday,2006年10月29日 - 2.0版
  • .NET 2.0的主要重写
  • 删除了对 Session的依赖
  • 删除了对 ViewState的依赖
  • 使用 ControlState 存储 GUID
  • 实现标准 IValidator
  • 完成渲染器的重写以获得更安全的验证程序
  • 添加了更多可调属性
  • 切换到 HttpRuntime 缓存
  • 将缓存优先级更改为 Caching.CacheItemPriority.NotRemovable ( 这是一个 Bug,固定在旧版本和新版本
  • 星期一 ,2007年01月29日 - 版本 2.1
  • 正确长度 Bug
  • 正确缓存 Bug ( 单位被设置为分钟,而不是秒) !
  • 添加选项以在 Session 中存储中的验证码文本
  • 添加最短时间以防止攻击性机器人
  • 改进的响应消息显示了为什么CAPTCHA被拒绝( 超时。输入错误。速度太快)

Server  控制  asp  asp-net  cap  验证码  
相关文章