HOW 2 LEARN ASP.NET
نویسنده : delshad
تاریخ  : ۱۳۸۵/۵/۲۳
امتیاز :
بازدید : 9631
موضوع : ساخت تصاویر امنیتی یا Verification image
توضیحات : در این مقاله به نحوه کار و ساخت تصاویر امنیتی (captcha)یا(Security Image) میپردازم.
     

در خیلی از سایت ها در هنگام عضویت یا استفاده از یک سرویس خاص شاهد تصویری هستید که شامل ترکیبی از کلمه و حروف و یا اعداد تصادفی است و شما باید متن داخل عکس را داخل یک تکس باکس وارد کنید تا اجازه ادامه عملیات را دریافت کنید  .

شاید بپرسید که دلیل این کار چیست ؟ دلیل اصلی این کار جلوگیری از ورود یک ربات به سیستم است ، به زبان ساده تر این تصاویر سامانه را از ورود یک انسان مطمئن می کند چرا که یک ربات هیچ گاه نمی تواند نوشته داخل تصویر را تشخصی دهد ، البته نرم افزار هایی برای تشخیص متن داخل عکس وجود دارند ولی با کمی تغییر در حروف و اعداد (مثلا افکت دادن به تصویر) دیگر قادر به تشخصی حروف و اعداد نخواهند بود .

در این مقاله قصد دارم ساخت این تصاویر امنیتی (  Verification Image یا Security Pictures  ) را توضیح بدهم :


برای اینکار به فضا نام های زیر نیاز داریم :

Imports System.Drawing.Text
Imports System.Drawing.Imaging
Imports System.Security.Cryptography
Imports System.Drawing

 

اکنون یه تابع تعریف می کنیم برای ساختن رشته حروف تصادفی :

Public Function CreateSalt( As String

        Dim rng As New RNGCryptoServiceProvider

        Dim buff(4) As Byte

        rng.GetBytes(buff)

        Return Convert.ToBase64String(buff)

    End Function

البته برای راحتی کار شما می توانید از تابع Random برای تولید یک عدد تصادفی نیز استفاده نمایید :

 

    Public Function CreateSalt() As String

        Dim rnd As New Random

        Return rnd.Next(10000, 99999)

    End Function


  اکنون رشته تولید شده را پس از کمی افکت و چرخش به عکس تبدیل می کنیم ...
 

    Public Function CreateImage(ByVal path As String, ByVal height As Integer, ByVal width As Integer) As String

        Dim r As New Random

        Dim salt As String = CreateSalt()

        Dim bmp As New Bitmap(width, height, PixelFormat.Format24bppRgb)

        Dim g As Graphics = Graphics.FromImage(bmp)

        g.TextRenderingHint = TextRenderingHint.AntiAlias

        g.Clear(Color.White)

        Dim mymat As New System.Drawing.Drawing2D.Matrix

        Dim i As Integer

        For i = 0 To Len(salt) - 1

            mymat.Reset()

            mymat.RotateAt(r.Next(-30, 0), New PointF(width * (0.12 * i), height * 0.5))

            g.Transform = mymat

            g.DrawString(salt.Chars(i), New Font("Comic Sans MS", 10, FontStyle.Italic), Brushes.Black, width * (0.12 * i), height * 0.5)

            g.ResetTransform()

        Next

        bmp.Save(path, ImageFormat.Gif)

        g.Dispose()

        bmp.Dispose()

        g.Dispose()

        bmp.Dispose()

        Return salt

    End Function

 

 تابع فوق با گرفتن 3 پارامتر ورودی Path که مسیر ذخیره سازی فایل عکس است و Height و Width که طول و عرض تصویر را مشخص می کند رشته مورد نظر ما را به تصویر تبدیل می کند و در نهایت متن داخل تصویر به خروجی تابع ارسال می گردد .

برای نمایش تصویر از یک کنترل Image استفاده می کنیم ، در ساب روتین مربوط به رویداد لود صفحه تصویر تولید شده را در این کنترل نمایش می دهیم همچنین متن داخل تصویر را داخل یک Session ذخیره می کنیم .

دقت نمایید مسیری که شما تصویر را در آن ذخیره می کنید باید پرمیشن Write داشته باشد (به خصوص در هاست)

        If Not Page.IsPostBack Then

            Dim salt As String = CreateImage(Server.MapPath("~\Temp\random.gif"), 40, 90)

            Image1.ImageUrl = "~/Temp/random.gif"

            Session.Add("salt", salt)

        End If

 

 

کار تمام است ، کافیست یک کنترل TextBox و یک کنترل Button قرار داده و پس از کلیک بر روی باتن مربوطه مقدار داخل TextBox را با مقدار داخل Session که همان متن اصلی داخل تصویر است مقایسه کنید :

 

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        If TextBox1.Text = Session.Item("salt") Then
            Response.Write("OK")
        Else
            Response.Write("Error")
        End If
    End Sub

شما می توانید فایل پروژه را از اینجا دانلود کنید


 

 

 
امتیاز بدهید :

نویسنده : علی دلشاد delshad@faradade.com ۱۳۸۹ بيست و نهم مرداد
بله ، کافیه کد کاربر و یک عدد UNIQ را به نام عکس الصاق کنید یا کلا از روش Generic Handler استفاده کنید که در بخش پرسش و پاسخ توضیح داده شده
نویسنده : حمید hamid_massaelly@yahoo.com ۱۳۸۹ بيست و نهم مرداد
عالیه ولی مشکل همزمانی داره اگه 2 تا Client همزمان صفحه را باز کنند و همزمان کد تولید عکس ایجاد بشه چی؟
نویسنده : korosh korosh_azizi2020@yahoo.com ۱۳۸۹ بيست تير
ممنون خیلی جالب بود امیدوارم بازم بنویسید
نویسنده : هادي hadidavari2009@yahoo.com ۱۳۸۹ دوم ارديبهشت
مهندس نميشه ببريش تو فاز #c
نویسنده : سعید طاهریان info@relax.ir ۱۳۸۹ اول ارديبهشت
علی جان دست درد نکنه من خیلی خوشحال شدم دیدم VB گذاشتین.
نویسنده : محمد mohammad.asd.18@gmail.com ۱۳۸۹ شانزدهم فروردين
ممنون
نویسنده : Mehdi Saghari m_saghari@yahoo.com ۱۳۸۸ هفتم اسفند
واسه تبدیل کدش این همه مبدل هست : http://www.developerfusion.com/tools/convert/vb-to-csharp/ اشکال اصلی این کد اینه که به قول معروف IN Fly عکس رو باید تشکیل بده نه اینکه یک جا فیزیکی ذخیره کنه ! واسه کش نشدنش باید یک عدد رندم آخرش اضافه بشه به همین راحتی !
نویسنده : من a_mari323@yahoo.com ۱۳۸۸ پنجم اسفند
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Drawing.Text ; using System.Drawing.Imaging; using System.Security.Cryptography ; using System.Drawing; public partial class Default2 : System.Web.UI.Page { public static string salt; protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { string salt = createimage(Server.MapPath("Sunset.jpg"), 60, 40); Image1.ImageUrl = "Sunset.jpg"; Session.Add("salt", salt); } } public static string craeterandom() { Random r = new Random(); int rch = r.Next(10000, 999999); string rchar = rch.ToString(); return rchar; } public static string createimage(string path, int with, int heigh) { Random r = new Random(); salt = craeterandom(); Bitmap bmp = new System.Drawing.Bitmap(with, heigh, PixelFormat.Format24bppRgb); Graphics graphicimage = Graphics.FromImage(bmp); graphicimage.TextRenderingHint = TextRenderingHint.AntiAlias; graphicimage.Clear(Color.BlueViolet); System.Drawing.Drawing2D.Matrix mymat = new System.Drawing.Drawing2D.Matrix(); double width, height; for (int i = 0; i < salt.Length ; i++) { mymat.Reset(); width = with * (0.12 * i); height = heigh * 0.5; mymat.RotateAt(r.Next(-30, 0), new PointF(float.Parse(width.ToString())+1, float.Parse(height.ToString())+1)); graphicimage.Transform = mymat; graphicimage.DrawString(salt.Substring(i, 1), new Font("Comic Sans MS", 10, FontStyle.Italic), Brushes.AliceBlue , float.Parse(width.ToString()), float.Parse(height.ToString())); graphicimage.ResetTransform(); } bmp.Save(path, ImageFormat.Gif); graphicimage.Dispose(); bmp.Dispose(); return salt; } protected void Button1_Click(object sender, EventArgs e) { if (TextBox1.Text == Session["salt"].ToString()) { Response.Write("OK"); } else { Response.Write("ERROR"); Response.Write(Session["salt"]); } } } اینا کدای c# دستورات بالاست رو سیستم خودم جواب میده
نویسنده : hassan hsn_iravani_computer@yahoo.com ۱۳۸۸ نوزدهم بهمن
این کد سی شارپ نذاشتین یا جائی که باید برم ببینم . خلاصه کد سی شارپ می خوام
نویسنده : hamed hamed_moh66@yahoo.com ۱۳۸۸ نهم بهمن
بابا کد سی شارپشو بزار تو سایت تا دعا کنم برا موفقیتت دوست عزیز . اگه برام ایمیلش کنی ممنون میشم.
نویسنده : مجتبی mojtaba_shokoh@yahoo.com ۱۳۸۸ هفتم بهمن
سلام،کد #C رو هم دارین اگه اونم بود ممنون میشدیم
نویسنده : کاوه ka1_fire@yahoo.com ۱۳۸۸ پانزدهم آذر
سلام رفیق کارت عالی بود. حرف نداشت. فقط اگه میشه کد #C رو هم بزارین ممنون میشم. متشکرم
نویسنده : پاپی hosin_papi@yahoo.com ۱۳۸۸ هجدهم آبان
خوب بود ولی امکانات بیشتری استفاده کنید یعنی مطالبی که به موضوع ربط داشته باشند را در موضوع خود بگنجانید(خیلی خوب بود بیشتر تلاش کن ممنون)
نویسنده : علی دلشاد delshad@faradade.com ۱۳۸۸ پانزدهم آبان
برای حل این مشکل کافیست در هنگام ذخیره عکس یک نام رندوم برای آن ایجاد نمایید موفق باشید
نویسنده : امير visual_basic_microsoft@yahoo.com ۱۳۸۸ دوم مهر
سلام اين راهي كه شما ميگيد يك مشكل داره و اون هم اينه كه تصوير ممكنه توي كش ذخيره بشه و اونوقت به مشكل بر ميخوره
نویسنده : mina redaster_m@yahoo.com ۱۳۸۸ نهم شهريور
thankfulness
نویسنده : احمد ahmadsamei@gmail.com ۱۳۸۸ چهارم شهريور
سلام من از اين كد استفاده كردم روي لوكال خوب اما رو هاست پيغام خطا مي ده: error in GDI+ مي شه كمك كنيد منون مي شم ايميل بزنيد
نویسنده : علی ali@gmail.com ۱۳۸۸ بيست و دوم مرداد
خیلی خوب بود ممنون
نویسنده : مجتبی جوارشکیان mjfakhr ۱۳۸۸ پنجم ارديبهشت
با تشکر - بسیار واضح و کامل توضیح داده شده است .
نویسنده : ali ۱۳۸۸ بيست و هفتم فروردين
با تشكر
نویسنده : ali moravveji ۱۳۸۷ بيست و يکم مهر

کد خوب و مفیدی بود متشکر

نویسنده : ahmad ahmad_abdali_m@yahoo.com ۱۳۸۷ چهاردهم شهريور
ba salam va khasta nabashed mesha source kamel pro roo bazared

 
نظر بدهید :
لطفا سوالات فنی خود را در تالار گفتگو www.forum.how2learnasp.net مطرح نمایید
نام :  
ایمیل :    
نظرات :
 
Xml rss feed

 

Valid CSS! Atom rss feed
Ali Delshad Official Site