در خیلی از سایت ها و قتی دارید عضو اون سایت میشید یا میخواهید سرویس خاصی ( مثل ایمیل) از اون سایت دریافت کنید شاهد تصویری هستید که شامل ترکیباتی از کلمه و حروف و یا اعداد تصادفی است و شما باید اون رو داخل یک تکس باکس وارد کنید تا اجازه ورود یا ثبت نام را دریافت نمایید .
این کار در حقیقت برای جلوگیری از هک شدن سایت بوسیله اکسپلویت بکار میره و اگر میبینید نوشته ها یکم کج و ماوج هستند برای اینه که هکر نتونه توسط نرم افزاری اونارو تشخیص بده خوب از این بحث بگذریم و بریم سراغ اصل مطلب
خوب میخوام ساخت این نوع تصاویر که Image verification یا Verification Picture هم بهش میگن رو توضیح بدم :
این عکس ها معمولا یک رشته از حروف به صورت تصادفی می باشند که در حقیقت به عکس تبدیل شدند و یکم کج و معوج میشند که نشه دوباره به رشته حرف تبدیلشون کرد ...
نحوه کار به این صورت هست که ابتدا یک رشته از حروف تصادفی ایجاد می کنیم این کار در دات نت بوسیله کتابخانه System.Security.Cryptography صورت می گیره
خوب حالا پس از ساخته شدن رشته حروف اونو به عکس تبدیل می کنیم برای اینکار به کتابخانه های زیر نیاز داریم :
خوب حالا یه تابع تعریف می کنیم برای ساختن رشته حروف تصادفی :کد:Imports System.Drawing.Text 'for font Imports System.Drawing.Imaging 'for saving the gif Imports System.Security.Cryptography 'for creating random String
البته باسه اینکه کارتون راحت بشه میتونید از اعداد تصادفی هم استفاده کنید:کد:Public Function CreateSalt(ByVal size As Integer) As String ' Generate a cryptographic random number using the cryptographic ' service provider Dim rng As New RNGCryptoServiceProvider Dim buff(size) As Byte rng.GetBytes(buff) ' Return a Base64 string representation of the random number Return Convert.ToBase64String(buff) End Function
حالا باید عکس مورد نظرمون رو تولید کنیم یه تابع برای تولید عکس ...کد:Public Function CreateSalt(ByVal size As Integer) As String dim rnd as new rand return rnd.next(size) End Function
ابتدا رشته تولید میشه سپس بوسیله drawstring و کمی چرخش دادن به نوشته ها اون رشته رو به یک تصویر تبدیل میکنیم
شما می تونید فونت و سایز مورد علاقه تون رو بگذارید حتی رنگ نوشته ها رو هم تغیر بدید من از فوتا comic با سایز 10 استفاده کردم ...
خوب تقریبا کار تمومه عکس رو توی اون PATH که بالا توی ورودی تابع وارد کریم ذخیره کردیمکد:Public Function CreateImage(ByVal path As String, ByVal height As Integer, ByVal width As Integer) As String 'Creates a Random Gif file of provided width and height 'the string on the gif file is rotated randomly 'returns the random string painted Dim r As New Random 'to generate a random angle Dim salt As String = CreateSalt(4) 'generates a random string Dim bmp As New Bitmap(width, height, PixelFormat.Format24bppRgb) 'creates a24bit bitmap in memory Dim g As Graphics = Graphics.FromImage(bmp) g.TextRenderingHint = TextRenderingHint.AntiAlias 'this will smoothen the Font g.Clear(Color.Black) 'this clears the background and paints specified color g.DrawRectangle(Pens.White, 1, 1, width - 3, height - 3) g.DrawRectangle(Pens.Black, 0, 0, width, height) Dim mymat As New System.Drawing.Drawing2D.Matrix 'matrix used for rotation transformation() Dim i As Integer For i = 0 To Len(salt) - 1 'we will rotate each literal at a specified angle mymat.Reset() ' matrix should be initialized to identity matrix mymat.RotateAt(r.Next(-30, 0), New PointF(width * (0.12 * i), height * 0.5)) 'rotate at any angle b/w -30 and 0 g.Transform = mymat 'apply the transform g.DrawString(salt.Chars(i), New Font("Comic Sans MS", 10, FontStyle.Italic), SystemBrushes.ActiveCaptionText, width * (0.12 * i), height * 0.5) 'draw the text onour(image) g.ResetTransform() Next bmp.Save(path, ImageFormat.Gif) 'save the gif at specified path and name g.Dispose() 'clean up bmp.Dispose() 'ok the mess is over g.Dispose() 'clean up bmp.Dispose() 'ok the mess is over Return salt 'return the string painted for verification End Function
میمونه نمایش و مقایسه...
برای نمایش عکس ابتدا یک کنترل از نوع iMAGE به اندازه 100 در 200 پیکسل و من آی دی اونو Imag1 گذاشتم داخل صفحه بگذارید
یک textbox با آی دی پیشفرض textbox1 و باتنی با آی دی پیشفرض button1 داخل صفحه میگذاریم
خوب توی ساب روتین لود صفحه عکس و رشته تصادفی رو می سازیم ....
مقدار رشته تصادفی رو توی یک session میریزیم که دوباره باهاش کار داریم البته شما هر جا دوست داشتید بریزدش...کد:Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles MyBase.Load If Not Page.IsPostBack Then Dim salt As String = CreateImage(Server.MapPath("Random.gif"), 100, 200) Image1.ImageUrl = Server.MapPath("Random.gif") Session.Add("salt", salt) End If End Sub
خوب تموم شد حالا میتونید هر بلایی سرش بیارید
مثلات وقتی باتن کلیک میشه اگه مقدار داخل textbox با مقدار session برابر بود کاربر رجستر شه اگه نه پیغام خطا بده...
منبع : یادبگیر . . .کد:Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click If Not TextBox1.Text.Equals(Session.Item("salt")) Then 'continue registration Else ' Error End If End Sub






پاسخ با نقل قول
Bookmarks