در این آموزش قصد داریم تا ضمن آشنایی با کدکپچا یا همان “تصاویر امنیتی”، نحوه ساخت آنها در زبان سی شارپ را فرا بگیریم. کد کپچا تصویری است که حاوی یک متن است که بصورت غیریکنواخت اما خوانا برای انسان و ناخوانا برای رباتها(بدافزارها) ترسیم شده است. ممکن است تعدادی خط یا نقطه اضافی بصورت درهم در این تصویر وجود داشته باشد و یا کاراکترهای رسم شده در تصویر ابعاد گوناگون و غیریکنواختی داشته باشند. هدف از این غیریکنواخت و درهم بودن این است که متن داخل تصویر فقط توسط انسان قابل درک باشد. اگر چنین هدفی محقق شود، می توانیم از تلاشهای مکرر روبات ها برای ورود به قسمت های مهم جلوگیری کنیم. نمونه کاربرد کدکپچا را در دنیای اینترنت بسیار دیده ایم. احتمالا هنگام استفاده از دروازه پرداخت اینترنتی بانک ها با این تصاویر روبرو شده اید. یا هنگام ورود به ایمیل یا ثبت نام در یک سایت هویت شما توسط این تصاویر مشخص شده است. کد کپچا برای تشخیص انسان بودن کاربر استفاده میشود. در ادامه می خواهیم با نحوهی ساخت این تصاویر در سی شارپ آشنا شویم. در پایان این آموزش قادر خواهیم بود تا تصاویر امنیتی مانند شکل زیر بسازیم:
با توجه به توضیحاتی که در مقدمه عنوان شد، اگر برای ساخت تصویر امنیتی یک کلاس جداگانه بسازیم، متدهایی که برای ساخت تصویر امنیتی در این کلاس نیاز خواهیم داشت، عبارتند از:
- متد رسم نقاط Random
- متد رسم خطوط Random
- متد ساخت عبارت Random
- متد ترسیم عکس و قرار دادن خروجی توابع بالا در آن
- متد اعتبارسنجی ورودی کاربر
متد رسم نقاط تصادفی در کپچا
تابعی که در ادامه آمده است، با هر بار فراخوانی یک جفت نقطه(هر کدام دارای مختصات x و y) میسازد.
private static Point[] GetRandomPoints() { Point[] points = { new Point(rand.Next(10, ۱۵۰), rand.Next(10, ۱۵۰)), new Point(rand.Next(10, ۱۰۰), rand.Next(10, ۱۰۰)) }; return points; }
متد رسم خطوط تصادفی در کپچا
تابع دیگری که نیاز است، باید بتواند یک شی گرافیکی(تصویر ایجاد شده یا بارگذاری شده) را به عنوان پارامتر ورودی دریافت کند و تعدادی خطوط به صورت تصادفی بر روی آن رسم کند. نمونه کد این تابع به شرح زیر است:
private static void DrawRandomLines(Graphics g) { SolidBrush green = new SolidBrush(Color.Green); //For Creating Lines on The Captcha for (int i = ۰; i < ۲۰; i++) { g.DrawLines(new Pen(green, ۲), GetRandomPoints()); } }
متد ساخت متن تصادفی برای کد کپچا
تابع دیگری که مورد نیاز است، تولید کنندهی عبارت امنیتی است. این تابع معمولا حروف الفبای انگلیسی و اعداد را شامل میشود. نمونهای از این تابع در مثال زیر آورده شده است:
private static string GetRandomText() { StringBuilder randomText = new StringBuilder(); if (String.IsNullOrEmpty(code)) { string alphabets = "abcdefghijklmnopqrstuvwxyz1234567890"; Random r = new Random(); for (int j = ۰; j <= ۵; j++) { randomText.Append(alphabets[r.Next(alphabets.Length)]); } code = randomText.ToString(); } return code; }
متد ترسیم تصویر کد کپچا
مهمترین تابع، تابعی است که عبارت امنیتی را بر روی تصویر ایجاد میکند. معمولا بیشترین تنوع و پیچیدگی باید در این تابع استفاده شود تا اطمینان حاصل کنیم که عبارت تولید شده فقط توسط انسان قابل فهم است. نمونهای از پیچیدگیها عبارتند از زاویه دادن به متن، کوچک و بزرگ کردن سایر کاراکترها، تغییر رنگ هر کاراکتر و… اما برای سادگی تنها بر روی تغییر سایز هر کاراکتر و موقعیت رسم هر کاراکتر(زاویه متن) تمرکز کردهایم. به نمونه کد زیر توجه نمایید:
public static Image CreateImage() { code = GetRandomText(); Bitmap bitmap = new Bitmap(200, 50, PixelFormat.Format32bppArgb); Graphics g = Graphics.FromImage(bitmap); Pen pen = new Pen(Color.Yellow); Rectangle rect = new Rectangle(0, 0, 200, 50); SolidBrush b = new SolidBrush(Color.Black); SolidBrush White = new SolidBrush(Color.White); int counter = 0; g.DrawRectangle(pen, rect); g.FillRectangle(b, rect); for (int i = 0; i < code.Length; i++) { g.DrawString(code[i].ToString(), new Font("Georgia", ۱۰ + rand.Next(14, 18)), White, new PointF(10 + counter, 10)); counter += 20; } DrawRandomLines(g); g.Dispose(); return bitmap; }
متد اعتبارسنجی ورودی کاربر
در نهایت تابعی نیاز است تا عبارت وارد شده توسط کاربر را با متنی که بر روی تصویر امنیتی رسم کردهایم مطابقت دهد. برای اینکار میتوانیم از نمونه کد زیر استفاده کنیم:
public static bool validate(string input) { if (code.Equals(input)) { return true; } return false; }
موفق و پیروز باشید!
همچنین می توانید نمونه پروژه مربوط به این آموزش را دانلود نمایید:
پسورد فایل: www.myempire.ir
[button color=”red” size=”medium” link=”https://myempire.ir/wp-content/uploads/captchaCodewww.myempire.ir_.zip” target=”blank” ]دریافت نمونه پروژه[/button]
با سلام
خیلی ممنون، عالی بود، منظم و جم وجور
راستی نمیشه بجای حروف انگلیسی از حروف فارسی استفاده کرد؟!
سلام،
امکان استفاده از حروف فارسی وجود داره، اما باید نکات زیر رو درنظر بگیرید.
اول اینکه در متد CreateImage فونتی که قراره متن رو ترسیم کنه باید کاراکترهای فارسی رو داشته باشه.
دوم اینکه در متد GetRandomText باید الفبای فارسی رو به جای الفبای انگلیسی قرار بدین.
موفق و پیروز باشید…
دمت گرم بابا!
خیلی فوق العاده بود
خواهش میکنم،
نظر لطفتونه!
دست تون درد نکنه خوب بود اما برای من اجرا نکرد و یه ارور داد