حتماً با CAPTCHA آشنا هستید. فرایندی که در طی آن متنی نمایش داده میشود که عمدتاً فقط یک انسان قادر به درک و پاسخگویی به آن است. با این کار از ارسال دادههای بیهوده توسط رباتها جلوگیری میشود.
reCAPTCHA ایدهای است که با نمایش کلمات واقعی و اسکن شده از کتابهای قدیمی، بخشی از مشکلات را حل کرده و از کاربران اینترنت برای شناسایی کلماتی که رایانه توانایی خواندن آنها را ندارد استفاده میکند. (شکل زیر)
با وارد کردن درست هر کلمه، بخشی از یک کتاب، روزنامه، و یا مجلهی قدیمی در رایانه شناسایی و به فرمت دیجیتال ذخیره میشود. به این شکل شما در دیجیتالی کردن متون کاغذی سهیم هستید.
پروژهی reCAPTCHA توسط گوگل حمایت میشود و در این آدرس قرار دارد.
به تازگی تیمی از دانشکده فنی دانشگاه تهران به همراه انستیتو تکنولوژی ایلینویز شیکاگو، پروژه ای بر همین اساس اما برای متون فارسی با عنوان CAPTCHAfa تولید کرده اند (شکل زیر) که در این آدرس در دسترس است. امیدوارم این پروژه به گونه ای تغییر کنه که برای دیجیتالی کردن متنهای پارسی استفاده بشه. در حال حاضر، این پروژه از کلماتی از پیش تعریف شده استفاده میکنه.
متاسفانه این پروژه در حال حاضر فقط توسط برنامههای PHP قابل استفاده است. از این رو بر آن شدم تا اون رو برای برنامههای ASP.NET (هم Web Forms و هم MVC) آماده کنم. برای استفاده از CAPTCHAfa نیاز به یک کلید خصوصی و یک کلید عمومی دارید که از این آدرس قابل دریافت است.
کدهای پروژهی Class Library به شرح زیر است.
استفاده در پروژههای ASP.NET Web Forms
ابتدا ارجاعی به فایل Captchafa.dll ایجاد کنید و سپس در روال Page_Load، کد زیر را قرار دهید. این کار برای تزریق اسکریپ CAPTCHAfa به صفحه استفاده میشود.
litCaptcha، یک کنترل Literal است که اسکریپت تولید شده، به عنوان متن آن معرفی میشود.
بررسی صحت مقدار وارد شده توسط کاربر (مثلاً در روال Click یک دکمه) به صورت زیر است.
استفاده در پروژههای ASP.NET MVC
ابتدا ارجاعی به فایل Captchafa.dll ایجاد کنید. در ASP.NET MVC بهتره تا فرایند کار رو در یک HTML helper کپسوله کنیم.
بررسی صحت مقدار وارد شده توسط کاربر (پس از ارسال فرم به Server) به صورت زیر است.
و در نهایت، کدهای View (از سینتکس موتور Razor استفاده شده است).
دموی پروژه رو در این آدرس قرار دادم. پروژهی نمونه نیز از این آدرس قابل دریافت است.
پ.ن: به زودی برخی بهبودها رو بر روی این پروژه انجام میدم.
reCAPTCHA ایدهای است که با نمایش کلمات واقعی و اسکن شده از کتابهای قدیمی، بخشی از مشکلات را حل کرده و از کاربران اینترنت برای شناسایی کلماتی که رایانه توانایی خواندن آنها را ندارد استفاده میکند. (شکل زیر)
با وارد کردن درست هر کلمه، بخشی از یک کتاب، روزنامه، و یا مجلهی قدیمی در رایانه شناسایی و به فرمت دیجیتال ذخیره میشود. به این شکل شما در دیجیتالی کردن متون کاغذی سهیم هستید.
پروژهی reCAPTCHA توسط گوگل حمایت میشود و در این آدرس قرار دارد.
به تازگی تیمی از دانشکده فنی دانشگاه تهران به همراه انستیتو تکنولوژی ایلینویز شیکاگو، پروژه ای بر همین اساس اما برای متون فارسی با عنوان CAPTCHAfa تولید کرده اند (شکل زیر) که در این آدرس در دسترس است. امیدوارم این پروژه به گونه ای تغییر کنه که برای دیجیتالی کردن متنهای پارسی استفاده بشه. در حال حاضر، این پروژه از کلماتی از پیش تعریف شده استفاده میکنه.
متاسفانه این پروژه در حال حاضر فقط توسط برنامههای PHP قابل استفاده است. از این رو بر آن شدم تا اون رو برای برنامههای ASP.NET (هم Web Forms و هم MVC) آماده کنم. برای استفاده از CAPTCHAfa نیاز به یک کلید خصوصی و یک کلید عمومی دارید که از این آدرس قابل دریافت است.
کدهای پروژهی Class Library به شرح زیر است.
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= // Captchafa demo for ASP.NET applications // by: Behrouz Rad // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= namespace Captcha { using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Web; public class Captchafa { private static readonly string PRIVATE_KEY = "your private key"; private static readonly string PUBLIC_KEY = "your public key"; private static readonly string CAPTCHAFA_API_SERVER = "http://www.captchafa.com/api"; private static readonly string CAPTCHAFA_VERIFY_SERVER = "http://www.captchafa.com/api/verify/"; private IDictionary<string, string> CaptchafaData { get { HttpContext httpContext = HttpContext.Current; string remoteIp = httpContext.Request.ServerVariables["REMOTE_ADDR"]; string challenge = httpContext.Request.Form["captchafa_challenge_field"]; string response = httpContext.Request.Form["captchafa_response_field"]; IDictionary<string, string> data = new Dictionary<string, string>() { {"privatekey" , PRIVATE_KEY }, {"remoteip" , remoteIp }, {"challenge" , challenge }, {"response" , response } }; return data; } } public static string CaptchafaGetHtml() { return string.Format("<script type=\"text/javascript\" src=\"{0}/?challenge&k={1}\"></script>", CAPTCHAFA_API_SERVER, PUBLIC_KEY); } public bool IsAnswerCorrect() { string dataToSend = this.CaptchafaPrepareDataToSend(this.CaptchafaData); string result = this.CaptchafaPostResponse(dataToSend); return result.StartsWith("true"); } private string CaptchafaPrepareDataToSend(IDictionary<string, string> data) { string result = string.Empty; StringBuilder sb = new StringBuilder(); foreach (var item in data) { sb.AppendFormat("{0}={1}&", item.Key, HttpUtility.UrlEncode(item.Value.Replace(@"\", string.Empty))); } result = sb.ToString(); sb = null; result = result.Substring(0, result.LastIndexOf("&")); return result; } private string CaptchafaPostResponse(string data) { StreamReader reader = null; Stream dataStream = null; WebResponse response = null; string responseFromServer = string.Empty; try { WebRequest request = WebRequest.Create(CAPTCHAFA_VERIFY_SERVER); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; byte[] byteData = Encoding.UTF8.GetBytes(data); request.ContentLength = byteData.Length; dataStream = request.GetRequestStream(); dataStream.Write(byteData, 0, byteData.Length); dataStream.Close(); response = request.GetResponse(); dataStream = response.GetResponseStream(); reader = new StreamReader(dataStream); responseFromServer = reader.ReadToEnd(); } finally { if (reader != null) { reader.Close(); } if (dataStream != null) { dataStream.Close(); } if (response != null) { response.Close(); } } return responseFromServer; } } }
ابتدا ارجاعی به فایل Captchafa.dll ایجاد کنید و سپس در روال Page_Load، کد زیر را قرار دهید. این کار برای تزریق اسکریپ CAPTCHAfa به صفحه استفاده میشود.
if (!IsPostBack) { litCaptcha.Text = Captchafa.CaptchafaGetHtml(); }
litCaptcha، یک کنترل Literal است که اسکریپت تولید شده، به عنوان متن آن معرفی میشود.
بررسی صحت مقدار وارد شده توسط کاربر (مثلاً در روال Click یک دکمه) به صورت زیر است.
Captchafa captchaFa = new Captchafa(); bool isAnswerCorrect = captchaFa.IsAnswerCorrect(); if (isAnswerCorrect) { // پاسخ صحیح است } else { // پاسخ صحیح نیست }
استفاده در پروژههای ASP.NET MVC
ابتدا ارجاعی به فایل Captchafa.dll ایجاد کنید. در ASP.NET MVC بهتره تا فرایند کار رو در یک HTML helper کپسوله کنیم.
public static class CaptchaHelper { public static MvcHtmlString Captchafa(this HtmlHelper htmlHelper) { return MvcHtmlString.Create(Captcha.Captchafa.CaptchafaGetHtml()); } }
بررسی صحت مقدار وارد شده توسط کاربر (پس از ارسال فرم به Server) به صورت زیر است.
[HttpPost] [ActionName("Index")] public ViewResult CaptchaCheck() { Captchafa captchaFa = new Captchafa(); bool isAnswerCorrect = captchaFa.IsAnswerCorrect(); if (isAnswerCorrect) { ViewBag.IsAnswerCorrect = true; } else { ViewBag.IsAnswerCorrect = false; } return View(); }
@using CaptchafaDemoMvc.Helpers; @{ ViewBag.Title = "Index"; } <form action="/" method="post"> @Html.Captchafa(); <input type="submit" id="btnCaptchafa" name="btnCaptchafa" value="آزمایش" /> @{ bool isAnswerExists = ViewBag.IsAnswerCorrect != null; } @if (isAnswerExists) { if ((bool)ViewBag.IsAnswerCorrect == true) { <span id="lblResult">پاسخ صحیح است</span> } else { <span id="lblResult">پاسخ صحیح نیست</span> } } </form>
دموی پروژه رو در این آدرس قرار دادم. پروژهی نمونه نیز از این آدرس قابل دریافت است.
پ.ن: به زودی برخی بهبودها رو بر روی این پروژه انجام میدم.