PDA

مشاهده نسخه کامل : ساخت تصاویر امنیتی یا Verification image در Asp.net



Security
13-12-07, 10:10
در خیلی از سایت ها و قتی دارید عضو اون سایت میشید یا میخواهید سرویس خاصی ( مثل ایمیل) از اون سایت دریافت کنید شاهد تصویری هستید که شامل ترکیباتی از کلمه و حروف و یا اعداد تصادفی است و شما باید اون رو داخل یک تکس باکس وارد کنید تا اجازه ورود یا ثبت نام را دریافت نمایید .

این کار در حقیقت برای جلوگیری از هک شدن سایت بوسیله اکسپلویت بکار میره و اگر میبینید نوشته ها یکم کج و ماوج هستند برای اینه که هکر نتونه توسط نرم افزاری اونارو تشخیص بده خوب از این بحث بگذریم و بریم سراغ اصل مطلب

خوب میخوام ساخت این نوع تصاویر که 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 استفاده کردم ...


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

خوب تقریبا کار تمومه عکس رو توی اون PATH که بالا توی ورودی تابع وارد کریم ذخیره کردیم
میمونه نمایش و مقایسه...

برای نمایش عکس ابتدا یک کنترل از نوع iMAGE به اندازه 100 در 200 پیکسل و من آی دی اونو Imag1 گذاشتم داخل صفحه بگذارید
یک textbox با آی دی پیشفرض textbox1 و باتنی با آی دی پیشفرض button1 داخل صفحه میگذاریم
خوب توی ساب روتین لود صفحه عکس و رشته تصادفی رو می سازیم ....


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

مقدار رشته تصادفی رو توی یک session میریزیم که دوباره باهاش کار داریم البته شما هر جا دوست داشتید بریزدش...

خوب تموم شد حالا میتونید هر بلایی سرش بیارید
مثلات وقتی باتن کلیک میشه اگه مقدار داخل 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

منبع : یادبگیر . . .

alisebt
09-08-10, 14:11
با سلام
در خط
bmp.Save(path, ImageFormat.Gif) 'save the gif at specified path and name

پیغام خطای
A generic error occurred in GDI+.
می دهد! مشکل از کجاست؟

ravegoat
02-09-10, 19:30
با سلام
در خط
bmp.Save(path, ImageFormat.Gif) 'save the gif at specified path and name

پیغام خطای
A generic error occurred in GDI+.
می دهد! مشکل از کجاست؟

با سلام!

قبل از هر چيز عضويتتون رو در PCN تبريك مي گم.

دوست عزيز فكر خيلي با تاخير دارم جوابتون رو ميدم...تاره سرم خلوت شده و تونستم سر اين كد فكر كنم.

اون سورسي رو آقا سعيد گذاشتند كلا" مشكل نداره و اصلا" با اون خطايي كه بيان كرديد مواجه نشدم ولي كلا" روش مسير دهي كه در پروژه به كار گرفته شده دردسر ساز هست. و پروژه رو يه بار تحت VS 2008 ساختم و ضميمه كردم. مي تونيد دانلودش كنيد و اگه مشكل داشت بفرماييد تا اگه تونستم راهنماييتون كنم.

موفق باشيد.

f_2006ir
23-12-10, 17:20
سلام لطفا نحوه رفرش کردن تصویر رو هم بیان کنین.
refresh در local جواب می ده ولی در host دچار مشکل می شه!!!!!!!!!!!!!

ravegoat
05-01-11, 09:51
سلام!

فكر مي كنم بهتر باشه براي Refresh كردن تصاوير از AJAX استفاده كرد. اگه وقت كردم يه بار ديگه نحوه ي به روز رساني تصوير رو بررسي مي كنم.

موفق باشيد