[-]
مهمان محترم به این انجمن خوش آمدید!
ورود به انجمنثبت نام در انجمن
زمان کنونی: يكشنبه 9 شهريور 1393, 12:52 بعدازظهر
نام کاربری:
کلمه عبور:


ارسال پاسخ  ارسال موضوع 
حالت موضوع بندی | حالت خطی
1 رای - 5 میانگین   « آموزش ساخت تصاویر امنیتی در ASP.Net
نویسنده متن پیام
Melika
عضو با سابقه
*
کاربر فارس وب

ارسال ها: 491
گروه کاربری: کاربر فارس وب
ثبت نام: يكشنبه 28 مرداد 1386
وضعیت: Offline

تعداد تشکرها از کاربران دیگر: 86
تشکر شده: 273 بار در 153 پست

** این مقاله برای اولین بار در انجمن های فارس وب نوشته شده است لطفا با ذکر بدون منبع آن زحمات نویسنده را هدر ندهید**

نام آموزش : استفاده از Generic Handler برای ایجاد تصاویر امنیتی
سطح : پیشرفته
منبع : [ جهت مشاهده لينك عضو شويد ! ]
---------------------------------------------------------

تصاویر امنیتی یکی از پرکاربردترین امکانات در فرم های ارسال اطلاعات است تا بتوان از ارسال اطلاعات نادرست تا حد امکان جلوگیری نمود به این منظور گاه از عکس های از پیش مشخص شده استفاده می گردد ولی در این آموزش نحوه ی استفاده از امکانات خود .net را برای تولید یک عکس تصادفی برا ی کد امنیتی را معرفی می نماییم.
برای این منظور :

ابتدا پروژه جدیدی ایجاد می کنیم ، سپس با استفاده از گزینه ی Add New Item ... ، یک Generic Handler به نام Security Code.ashx ایجاد می نماییم.
سپس توابع زیر را اضافه می نماییم :

private Bitmap GenerateImage(string textint widthint heightstring fontFamily)
    {
        
Random random = new Random();

        
// Create a new 32-bit bitmap image.
        
Bitmap bitmap = new Bitmap(widthheightPixelFormat.Format32bppArgb);

        
// Create a graphics object for drawing.
        
Graphics g Graphics.FromImage(bitmap);
        
g.SmoothingMode SmoothingMode.AntiAlias;
        
Rectangle rect = new Rectangle(00widthheight);

        
// Fill in the background.
        
HatchBrush hatchBrush = new HatchBrush(HatchStyle.WaveColor.LightGrayColor.White);
        
g.FillRectangle(hatchBrushrect);

        
// Set up the text font.
        
SizeF size;
        
float fontSize rect.Height 1;
        
Font font;
        
StringFormat format = new StringFormat();
        
format.Alignment StringAlignment.Center;
        
format.LineAlignment StringAlignment.Center;

        
// Adjust the font size until the text fits within the image.
        
do
        {
            
fontSize--;
            
font = new Font(fontFamilyfontSizeFontStyle.Bold);
            
size g.MeasureString(textfont, new SizeF(widthheight), format);
        } while (
size.Width rect.Width);

        
// Create a path using the text and warp it randomly.
        
GraphicsPath path = new GraphicsPath();
        
path.AddString(textfont.FontFamily, (int)font.Stylefont.Sizerectformat);
        
float v 4F;
        
PointF[] points =
            {
                new 
PointF(random.Next(rect.Width) / vrandom.Next(rect.Height) / v),
                new 
PointF(rect.Width random.Next(rect.Width) / vrandom.Next(rect.Height) / v),
                new 
PointF(random.Next(rect.Width) / vrect.Height random.Next(rect.Height) / v),
                new 
PointF(rect.Width random.Next(rect.Width) / vrect.Height random.Next(rect.Height) / v)
            };
        
Matrix matrix = new Matrix();
        
matrix.Translate(0F0F);
        
path.Warp(pointsrectmatrixWarpMode.Perspective0F);

        
// Draw the text.
        
hatchBrush = new HatchBrush(HatchStyle.DashedUpwardDiagonalColor.DarkGrayColor.Black);
        
g.FillPath(hatchBrushpath);

        
// Add some random noise.
        
int m Math.Max(rect.Widthrect.Height);
        for (
int i 0< (int)(rect.Width rect.Height 30F); i++)
        {
            
int x random.Next(rect.Width);
            
int y random.Next(rect.Height);
            
int w random.Next(50);
            
int h random.Next(50);
            
g.FillEllipse(hatchBrushxywh);
        }

        
// Clean up.
        
font.Dispose();
        
hatchBrush.Dispose();
        
g.Dispose();

        return 
bitmap;
    } 


توضیح تابع GenerateImage :
در این تابع عکس را به صورت Run Time ایجاد می نماییم .
در ابتدا با استفاده از دستور ات بالا عکس را ایجاد کرده ، در پس زمینه آن خط ها ، مربع هایی را ایجاد می کنیم ، سایز ، نوع قلم نگارش را انتخاب می کنیم ، تصاویری برای Noise های موجود بر تصاویر به صورت تصادفی ایجاد می نماییم .


جال نیاز به تابعی داریم برای ایجاد رشته ای که می خواهیم کاربر وارد نماید ، این عبارت می بایست Random باشد و هر دفعه عبارتی متفاوت با قبل باشد :

private string generateRandomString(int size)
    {
        
StringBuilder builder = new StringBuilder();
        
Random random = new Random();
        
char ch;
        for (
int i 0sizei++)
        {
            
ch Convert.ToChar(Convert.ToInt32(Math.Floor(26 random.NextDouble() + 65)));
            
builder.Append(ch);
        }
        return 
builder.ToString();
    } 


این تایع این کار را برای ما انجام می دهد .

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

public void ProcessRequest(HttpContext context)
    {
        if(
context.Session["SecurityCode"] == null)
        {
            
context.Session["SecurityCode"] = generateRandomString(4).ToUpper();
        }

        
GenerateImage(context.Session["SecurityCode"].ToString(), 10020"Arial").Save(context.Response.OutputStreamImageFormat.Jpeg);
    } 


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

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.SessionState;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Text


حال کار تمام شده است ، شما می توانید این عکس را در صفحه تان ایجاد نمایید :
کافی است در صفحه aspx تان یک image اضافه نمایید و از Properties آن خاصیت ImageURL را نام صفحه ی ashx تان قرار دهید :
ImageURL = Security Code.ashx


توجه یا روشی جدید : شما می توانید در صفحات معمولی با پسوند aspx نیز این عکس را ایجاد نمایید ولی در آن صورت باید عکس را به صورت Outputstream نمایش دهید و زمانی که تابع Save آن فراخوانی می شود تنها آن عکس به شما نمایش داده می شود و دیگر اجزای صفحه قابل نمایش نیستند که این یک مشکل بزرگ است زیرا فرم شما تنها عکس نیست ، پس از این فرمت استفاده می نماییم تا بتوانیم در بین فرممان تنها عکسی را ایجاد نماییم.
ولی این هم روشی برای ایجاد تصاویر امنیتی است بعنوان نمونه اگر خواستید در فرمی که بوسیله HTML است می توانید این روش را استفاه نمایید :

جایی که می خواهید این عکس باشد (در HTML) :

<img height="30" alt="Please Enter This To TextBox" 
src="securityImage.aspx" width="80"

خوب حالا باید کد securityImage.aspx رو بنویسیم :

public class securityimage System.Web.UI.Page 

private 
void Page_Load(object senderSystem.EventArgs e

Bitmap objBMP =new System.Drawing.Bitmap(60,20); 
Graphics objGraphics System.Drawing.Graphics.FromImage(objBMP); 
objGraphics.Clear(Color.Green); 
objGraphics.TextRenderingHint TextRenderingHint.AntiAlias
//' فونتی که میخوایم نشون داده بشه 
Font objFont = new Font("Arial"8FontStyle.Bold); 
string randomString=""
int[] myIntArray = new int[5] ; 
int x
//یک عبارت راندوم رو تولید میکنیم 
Random autoRand = new Random(); 
for (
x=0;x<5;x++) 

myIntArray[x] = System.Convert.ToInt32 (autoRand.Next(0,9)); 
randomString+= (myIntArray[x].ToString ()); 

//رشته تولید شده رو تو کوکی ذخیره میکنیم تا بعدا چک کنیم 
Session.Add("randomString",randomString); 
//' Write out the text 
objGraphics.DrawString(randomStringobjFontBrushes.White33); 
//' نوع عکس رو مشخص میکنیم و درواقع بصورت هدر میفرستیم 
Response.ContentType "image/GIF"
objBMP.Save(Response.OutputStreamImageFormat.Gif); 
objFont.Dispose(); 
objGraphics.Dispose(); 
objBMP.Dispose(); 




خوب حالا فقط موند چک کردن عبارت پس :

private void button1_ServerClick(object senderSystem.EventArgs e

if (
Page.IsValid && (text1.Value.ToString () ==Session["randomString"].ToString ()))  

// کدی که میخوایم اگه صحیح بود اجرا بشه 

else 

Label1.Text ="Sorry you Did not entered correct Security Code"





امیدوارم این آموزش مورد استفاده تان قرار گیرد. هوم

در ادامه فایل همین آموزش (با استفاده از Generic Handler) به همراه استفاده از آن قرار دارد : [ جهت مشاهده لينك عضو شويد ! ]



** این مقاله برای اولین بار در انجمن های فارس وب نوشته شده است لطفا با ذکر بدون منبع آن زحمات نویسنده را هدر ندهید**


خورشید را باور دارم حتی اگر پشت ابرها باشد...


بهترین جا برای گرفتن جواب سوال در انجمن هاست نه پیام شخصی ....

آخرین ویرایش ارسال در: جمعه 3 آبان 1387 11:40 بعدازظهر توسط Melika.

پنجشنبه 3 مرداد 1387 9:35 بعدازظهر یافتن تمام ارسال های این کاربر نقل قول این ارسال در پاسخ
تشکر شده توسط: Bonyanalam - pascal - kiarash22 - melodious
نویسنده متن پیام
marzieh309
عضو تازه وارد
*
کاربر فارس وب

ارسال ها: 1
گروه کاربری: کاربر فارس وب
ثبت نام: جمعه 3 آبان 1387
وضعیت: Offline

تعداد تشکرها از کاربران دیگر: 0
تشکر شده: 0 بار در 0 پست

سلام خسته نباشد ممنون از مقاله زیبا و مفیدتون .
من یک ا مشکل دارم :
این که فایلی رو که گذاشتید رو نمی تونم دانلود کنمگریان

جمعه 3 آبان 1387 8:20 بعدازظهر یافتن تمام ارسال های این کاربر نقل قول این ارسال در پاسخ
نویسنده متن پیام
Melika
عضو با سابقه
*
کاربر فارس وب

ارسال ها: 491
گروه کاربری: کاربر فارس وب
ثبت نام: يكشنبه 28 مرداد 1386
وضعیت: Offline

تعداد تشکرها از کاربران دیگر: 86
تشکر شده: 273 بار در 153 پست

الان دیگه نباید مشکلی داشته باشید فایل رو درست کردم ، مرسی که اطلاع دادید.


خورشید را باور دارم حتی اگر پشت ابرها باشد...


بهترین جا برای گرفتن جواب سوال در انجمن هاست نه پیام شخصی ....
جمعه 3 آبان 1387 11:47 بعدازظهر یافتن تمام ارسال های این کاربر نقل قول این ارسال در پاسخ
نویسنده متن پیام
hapkidoghf
عضو تازه وارد
*
کاربر فارس وب

ارسال ها: 1
گروه کاربری: کاربر فارس وب
ثبت نام: يكشنبه 8 شهريور 1388
وضعیت: Offline

تعداد تشکرها از کاربران دیگر: 0
تشکر شده: 0 بار در 0 پست

سلام خسته نباشي من نمي تونم دانلودش كنم
اگه زحمتي نيست مي توني برام ايميل كني
خيلي شرمندتم
hapkidoghf@yahoo.com

پنجشنبه 18 فروردين 1390 6:39 بعدازظهر یافتن تمام ارسال های این کاربر نقل قول این ارسال در پاسخ
نویسنده متن پیام
RadX986
عضو تازه وارد
*
کاربر فارس وب

ارسال ها: 2
گروه کاربری: کاربر فارس وب
ثبت نام: چهارشنبه 12 بهمن 1390
وضعیت: Offline

تعداد تشکرها از کاربران دیگر: 0
تشکر شده: 0 بار در 0 پست

مهندس، این فایل رو زحمت کشیدی ساختی، چطور مقایسه کنیم مقدار تصویر و خود تصویر رو؟

شنبه 22 بهمن 1390 7:19 بعدازظهر یافتن تمام ارسال های این کاربر نقل قول این ارسال در پاسخ
نویسنده متن پیام
moal
عضو تازه وارد
*
کاربر فارس وب

ارسال ها: 1
گروه کاربری: کاربر فارس وب
ثبت نام: چهارشنبه 7 فروردين 1392
وضعیت: Offline

تعداد تشکرها از کاربران دیگر: 0
تشکر شده: 0 بار در 0 پست

fail daryaft nemisheh

چهارشنبه 7 فروردين 1392 7:56 قبل‏ازظهر یافتن تمام ارسال های این کاربر نقل قول این ارسال در پاسخ
نویسنده متن پیام
tiba22
عضو تازه وارد
*
کاربر فارس وب

ارسال ها: 1
گروه کاربری: کاربر فارس وب
ثبت نام: يكشنبه 18 اسفند 1392
وضعیت: Offline

تعداد تشکرها از کاربران دیگر: 0
تشکر شده: 0 بار در 0 پست

Melika نوشته است:
** این مقاله برای اولین بار در انجمن های فارس وب نوشته شده است لطفا با ذکر بدون منبع آن زحمات نویسنده را هدر ندهید**

نام آموزش : استفاده از Generic Handler برای ایجاد تصاویر امنیتی
سطح : پیشرفته
منبع : [ جهت مشاهده لينك عضو شويد ! ]
---------------------------------------------------------

تصاویر امنیتی یکی از پرکاربردترین امکانات در فرم های ارسال اطلاعات است تا بتوان از ارسال اطلاعات نادرست تا حد امکان جلوگیری نمود به این منظور گاه از عکس های از پیش مشخص شده استفاده می گردد ولی در این آموزش نحوه ی استفاده از امکانات خود .net را برای تولید یک عکس تصادفی برا ی کد امنیتی را معرفی می نماییم.
برای این منظور :

ابتدا پروژه جدیدی ایجاد می کنیم ، سپس با استفاده از گزینه ی Add New Item ... ، یک Generic Handler به نام Security Code.ashx ایجاد می نماییم.
سپس توابع زیر را اضافه می نماییم :

private Bitmap GenerateImage(string textint widthint heightstring fontFamily)
    {
        
Random random = new Random();

        
// Create a new 32-bit bitmap image.
        
Bitmap bitmap = new Bitmap(widthheightPixelFormat.Format32bppArgb);

        
// Create a graphics object for drawing.
        
Graphics g Graphics.FromImage(bitmap);
        
g.SmoothingMode SmoothingMode.AntiAlias;
        
Rectangle rect = new Rectangle(00widthheight);

        
// Fill in the background.
        
HatchBrush hatchBrush = new HatchBrush(HatchStyle.WaveColor.LightGrayColor.White);
        
g.FillRectangle(hatchBrushrect);

        
// Set up the text font.
        
SizeF size;
        
float fontSize rect.Height 1;
        
Font font;
        
StringFormat format = new StringFormat();
        
format.Alignment StringAlignment.Center;
        
format.LineAlignment StringAlignment.Center;

        
// Adjust the font size until the text fits within the image.
        
do
        {
            
fontSize--;
            
font = new Font(fontFamilyfontSizeFontStyle.Bold);
            
size g.MeasureString(textfont, new SizeF(widthheight), format);
        } while (
size.Width rect.Width);

        
// Create a path using the text and warp it randomly.
        
GraphicsPath path = new GraphicsPath();
        
path.AddString(textfont.FontFamily, (int)font.Stylefont.Sizerectformat);
        
float v 4F;
        
PointF[] points =
            {
                new 
PointF(random.Next(rect.Width) / vrandom.Next(rect.Height) / v),
                new 
PointF(rect.Width random.Next(rect.Width) / vrandom.Next(rect.Height) / v),
                new 
PointF(random.Next(rect.Width) / vrect.Height random.Next(rect.Height) / v),
                new 
PointF(rect.Width random.Next(rect.Width) / vrect.Height random.Next(rect.Height) / v)
            };
        
Matrix matrix = new Matrix();
        
matrix.Translate(0F0F);
        
path.Warp(pointsrectmatrixWarpMode.Perspective0F);

        
// Draw the text.
        
hatchBrush = new HatchBrush(HatchStyle.DashedUpwardDiagonalColor.DarkGrayColor.Black);
        
g.FillPath(hatchBrushpath);

        
// Add some random noise.
        
int m Math.Max(rect.Widthrect.Height);
        for (
int i 0< (int)(rect.Width rect.Height 30F); i++)
        {
            
int x random.Next(rect.Width);
            
int y random.Next(rect.Height);
            
int w random.Next(50);
            
int h random.Next(50);
            
g.FillEllipse(hatchBrushxywh);
        }

        
// Clean up.
        
font.Dispose();
        
hatchBrush.Dispose();
        
g.Dispose();

        return 
bitmap;
    } 


توضیح تابع GenerateImage :
در این تابع عکس را به صورت Run Time ایجاد می نماییم .
در ابتدا با استفاده از دستور ات بالا عکس را ایجاد کرده ، در پس زمینه آن خط ها ، مربع هایی را ایجاد می کنیم ، سایز ، نوع قلم نگارش را انتخاب می کنیم ، تصاویری برای Noise های موجود بر تصاویر به صورت تصادفی ایجاد می نماییم .


جال نیاز به تابعی داریم برای ایجاد رشته ای که می خواهیم کاربر وارد نماید ، این عبارت می بایست Random باشد و هر دفعه عبارتی متفاوت با قبل باشد :

private string generateRandomString(int size)
    {
        
StringBuilder builder = new StringBuilder();
        
Random random = new Random();
        
char ch;
        for (
int i 0sizei++)
        {
            
ch Convert.ToChar(Convert.ToInt32(Math.Floor(26 random.NextDouble() + 65)));
            
builder.Append(ch);
        }
        return 
builder.ToString();
    } 


این تایع این کار را برای ما انجام می دهد .

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

public void ProcessRequest(HttpContext context)
    {
        if(
context.Session["SecurityCode"] == null)
        {
            
context.Session["SecurityCode"] = generateRandomString(4).ToUpper();
        }

        
GenerateImage(context.Session["SecurityCode"].ToString(), 10020"Arial").Save(context.Response.OutputStreamImageFormat.Jpeg);
    } 


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

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.SessionState;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Text


حال کار تمام شده است ، شما می توانید این عکس را در صفحه تان ایجاد نمایید :
کافی است در صفحه aspx تان یک image اضافه نمایید و از Properties آن خاصیت ImageURL را نام صفحه ی ashx تان قرار دهید :
ImageURL = Security Code.ashx


توجه یا روشی جدید : شما می توانید در صفحات معمولی با پسوند aspx نیز این عکس را ایجاد نمایید ولی در آن صورت باید عکس را به صورت Outputstream نمایش دهید و زمانی که تابع Save آن فراخوانی می شود تنها آن عکس به شما نمایش داده می شود و دیگر اجزای صفحه قابل نمایش نیستند که این یک مشکل بزرگ است زیرا فرم شما تنها عکس نیست ، پس از این فرمت استفاده می نماییم تا بتوانیم در بین فرممان تنها عکسی را ایجاد نماییم.
ولی این هم روشی برای ایجاد تصاویر امنیتی است بعنوان نمونه اگر خواستید در فرمی که بوسیله HTML است می توانید این روش را استفاه نمایید :

جایی که می خواهید این عکس باشد (در HTML) :

<img height="30" alt="Please Enter This To TextBox" 
src="securityImage.aspx" width="80"

خوب حالا باید کد securityImage.aspx رو بنویسیم :

public class securityimage System.Web.UI.Page 

private 
void Page_Load(object senderSystem.EventArgs e

Bitmap objBMP =new System.Drawing.Bitmap(60,20); 
Graphics objGraphics System.Drawing.Graphics.FromImage(objBMP); 
objGraphics.Clear(Color.Green); 
objGraphics.TextRenderingHint TextRenderingHint.AntiAlias
//' فونتی که میخوایم نشون داده بشه 
Font objFont = new Font("Arial"8FontStyle.Bold); 
string randomString=""
int[] myIntArray = new int[5] ; 
int x
//یک عبارت راندوم رو تولید میکنیم 
Random autoRand = new Random(); 
for (
x=0;x<5;x++) 

myIntArray[x] = System.Convert.ToInt32 (autoRand.Next(0,9)); 
randomString+= (myIntArray[x].ToString ()); 

//رشته تولید شده رو تو کوکی ذخیره میکنیم تا بعدا چک کنیم 
Session.Add("randomString",randomString); 
//' Write out the text 
objGraphics.DrawString(randomStringobjFontBrushes.White33); 
//' نوع عکس رو مشخص میکنیم و درواقع بصورت هدر میفرستیم 
Response.ContentType "image/GIF"
objBMP.Save(Response.OutputStreamImageFormat.Gif); 
objFont.Dispose(); 
objGraphics.Dispose(); 
objBMP.Dispose(); 




خوب حالا فقط موند چک کردن عبارت پس :

private void button1_ServerClick(object senderSystem.EventArgs e

if (
Page.IsValid && (text1.Value.ToString () ==Session["randomString"].ToString ()))  

// کدی که میخوایم اگه صحیح بود اجرا بشه 

else 

Label1.Text ="Sorry you Did not entered correct Security Code"





امیدوارم این آموزش مورد استفاده تان قرار گیرد. هوم

در ادامه فایل همین آموزش (با استفاده از Generic Handler) به همراه استفاده از آن قرار دارد : [ جهت مشاهده لينك عضو شويد ! ]



** این مقاله برای اولین بار در انجمن های فارس وب نوشته شده است لطفا با ذکر بدون منبع آن زحمات نویسنده را هدر ندهید**


===============
سر کاریه داداش؟ این فایلت که دانلود نمیشه . بعدم اگه ممکنه همین توضیحاتتو تو مرورگرهای دیگه ببین که چقدر داغونه . تو ie فقط درسته

يكشنبه 18 اسفند 1392 9:17 قبل‏ازظهر یافتن تمام ارسال های این کاربر نقل قول این ارسال در پاسخ
« قدیمی های بعدی | جدید های بعدی »
ارسال پاسخ  ارسال موضوع 

کاربران در حال بازدید از این مبحث
 1 مهمان

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

پرش به انجمن: