| Главная | Журнал | Форум | Wiki | DRKB | Страны мира |
Серверный контрол КАПЧА для ASP.NET
Сейчас уже каждый знает, что такое спам. На сегодняшний день существует два основных метода борьбы с автоматической рассылкой нежелательной информации: Байесовская фильтрация (POPFile) и запрос в виде искажённой картинки, требующий ответа пользователя. Конечно, оба этих подхода имеют свои плюсы и минусы. Здесь мы обсудим второй способ: проверки, что входящие данные были введены человеком, а не ботом или сценарием. Технология КАПЧА (CAPTCHA) - это один из способов убедиться, что мы имеем дело с человеком. Сейчас есть множество способов реализации КАПЧА, но здесь мы сосредоточимся на визуальном вводе данных капчи. РеализацияПервая задача, которую необходимо решить, это сгенерировать изображение в классе капчи. Можно для этого использовать отдельную .aspx-форму, но тогда это не будет являться серверным контролом. Чтобы реально генерировать изображение "на лету", можно воспользоваться перехватчиком HttpHandler, который аккуратно решает эту задачу. Все, что нам нужно, это немного измененить в Web.config раздел <system.web>: <httpHandlers>
<add verb="GET" path="CaptchaImage.aspx"
type="WebControlCaptcha.CaptchaImageHandler, WebControlCaptcha" />
</httpHandlers>
Этот обработчик определяет специальную страницу с именем CaptchaImage.aspx. В реале этой страницы не существует, однако когда прийдёт запрос к этой странице, то он будет перехвачен и обработан классом, включающим в себя интерфейс IHttpHandler: CaptchaImageHandler, как показано ниже: Public Sub ProcessRequest(ByVal context As System.Web.HttpContext) _
Implements System.Web.IHttpHandler.ProcessRequest
Dim app As HttpApplication = context.ApplicationInstance
'-- получаем уникальный GUID капчи;
' он должен быть передан в запросе
Dim strGuid As String = Convert.ToString(app.Request.QueryString("guid"))
Dim ci As CaptchaImage
If strGuid = "" Then
'-- создаём картинку капчи с дефолтовыми настройками
'-- в основном для процесса отладки кода
ci = New CaptchaImage
Else
'-- получаем капчу из кэша ASP.NET по GUID
ci = CType(app.Context.Cache(strGuid), CaptchaImage)
app.Context.Cache.Remove(strGuid)
End If
'-- записываем картинку в выходной HTTP-поток как массив байт
ci.Image.Save(app.Context.Response.OutputStream, _
Drawing.Imaging.ImageFormat.Jpeg)
'-- Указываем для браузера, что это картинка,
'-- и указываем статус обработки запроса 200-Окей
app.Response.ContentType = "image/jpeg"
app.Response.StatusCode = 200
app.Response.End()
End Sub
После выполнения этого кода, будет сгенерирована новая капча-картинка и отправлена в браузер прямо из памяти. Всё, проблема решена! Однако, есть другая проблема. Должна быть связь между HttpHandler отвечающим за отображение картинки и веб-страницей контрола - в противном случае, как вызывающий контрол узнает, какой текст был сгенерирован в капче ? Если просмотреть исходный код сгенерированного контрола, то будет видно, что GUID передается в строке запроса: <img src="CaptchaImage.aspx?guid=99fecb18-ba00-4b60-9783-37225179a704"
border='0'>
Этот GUID (глобальный уникальный идентификатор) является ключом, используемым для доступа к объекту CAPTCHA, который изначально был сохранён в кэше ASP.NET контролом. Давайте взглянем на метод CaptchaControl.GenerateNewCaptcha: Private Sub GenerateNewCaptcha()
LocalGuid = Guid.NewGuid.ToString
If Not IsDesignMode Then
HttpContext.Current.Cache.Add(LocalGuid, _captcha, Nothing, _
DateTime.Now.AddSeconds(HttpContext.Current.Session.Timeout), _
TimeSpan.Zero, Caching.CacheItemPriority.NotRemovable, Nothing)
End If
Me.CaptchaText = _captcha.Text
Me.GeneratedAt = Now
End Sub
Этот код может показаться немного странным, тем не менее он прекрасно работает! Последовательность событий ASP.NET выглядит следующим образом: 1. Генерируется страница. Свойства CaptchaControlCaptchaControl надлежащим образом реализует все дефолтовые свойства Серверного элемента управления ASP.NET, а также несколько собственных свойств:
Постарайтесь настроить эти свойства с компромисом, чтобы с одной стороны программе оптического распознавания не удалось вычислить искажённый текст, а с другой - чтобы реальный человек смог пробиться через капчу! Для иллюстрации, посмотрите на две капчи:
CAPTCHA слева создается со всеми настройками "medium", что даёт разумный компромисс между визуальным восприятием человеком и читаемостью оптической распознавалки. CAPTCHA справа использует меньшее значение CaptchaFontWarping и меньшую длину CaptchaLength. Скачать исходник для ASP.NET 2.0 - 14 кб Скачать исходник для ASP.NET 1.1 - 22 кб |
Основные разделы сайта
|
|
|