ایمان نکونام : وب مهراز - جامعه برنامه نویسان

ساخت تصاویر امنیتی یا Verification image در asp.net

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

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

در این مقاله قصد دارم ساخت این تصاویر امنیتی (  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


تعداد بازدید : 452
ارسال به دوستان

ارسال