انجمن‌های فارس وب

نسخه کامل: آموزش ساخت تصاویر امنیتی در ASP.Net
شما در حال بازدید از بایگانی ارسال های انجمن هستید این نسخه کامل نیست : برای مشاهده نسخه کامل اینجا کلیک کنید
** این مقاله برای اولین بار در انجمن های فارس وب نوشته شده است لطفا با ذکر بدون منبع آن زحمات نویسنده را هدر ندهید**

نام آموزش : استفاده از 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) به همراه استفاده از آن قرار دارد : [ جهت مشاهده لينك عضو شويد ! ]



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

سلام خسته نباشد ممنون از مقاله زیبا و مفیدتون .
من یک ا مشکل دارم :
این که فایلی رو که گذاشتید رو نمی تونم دانلود کنمگریان
الان دیگه نباید مشکلی داشته باشید فایل رو درست کردم ، مرسی که اطلاع دادید.
سلام خسته نباشي من نمي تونم دانلودش كنم
اگه زحمتي نيست مي توني برام ايميل كني
خيلي شرمندتم
hapkidoghf@yahoo.com
مهندس، این فایل رو زحمت کشیدی ساختی، چطور مقایسه کنیم مقدار تصویر و خود تصویر رو؟
fail daryaft nemisheh

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 فقط درسته

مرجع آدرس ها