در خیلی از سایت ها در هنگام عضویت یا استفاده از یک سرویس خاص شاهد تصویری هستید که شامل ترکیبی از کلمه و حروف و یا اعداد تصادفی است و شما باید متن داخل عکس را داخل یک تکس باکس وارد کنید تا اجازه ادامه عملیات را دریافت کنید .
شاید بپرسید که دلیل این کار چیست ؟ دلیل اصلی این کار جلوگیری از ورود یک ربات به سیستم است ، به زبان ساده تر این تصاویر سامانه را از ورود یک انسان مطمئن می کند چرا که یک ربات هیچ گاه نمی تواند نوشته داخل تصویر را تشخصی دهد ، البته نرم افزار هایی برای تشخیص متن داخل عکس وجود دارند ولی با کمی تغییر در حروف و اعداد (مثلا افکت دادن به تصویر) دیگر قادر به تشخصی حروف و اعداد نخواهند بود .
در این مقاله قصد دارم ساخت این تصاویر امنیتی ( 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
شما می توانید فایل پروژه را از اینجا دانلود کنید