كارت dvb , كارت دي وي بي , دی وی بی , رسيور , رسیور

فروشگاه سايت

تبليغات

آخرين ارسالي‌هاي ASP.NET

آموزش ساخت تصاویر امنیتی

اين يك بخش از موضوع آموزش ساخت تصاویر امنیتی است كه در انجمن ASP.NET مطرح گرديده و اين انجمن نيز زير مجموعه‌ي طراحی صفحات داینامیک است: تصویر امنیتی چیست ؟ احتمالا شما در هنگام دانلود فایل یا هنگام ثبت نام در برخی از سایت ها درگیر پر کردن فرم های کوچک و بزرگی شده اید. در این فرم ها احتمالا با یک تصویری که در آن چند کاراکتر و یا عدد به شکلی سوال انگیز در ...

 

بازگشت   انجمن های آموزشی پارس > برنامه نویسی و طراحی وب ، سيستمهاي مديريت سایت > طراحی صفحات داینامیک > ASP.NET


اطلاعيه‌هاي سايت

 

لطفاً پيش از فعاليت در سايت، قوانين سايت را مطالعه نماييد

كليه‌ي كاربراني كه توانايي مديريت هر يك از بخش‌هاي سايت را دارند، با كليك روي اين لينك به مديريت سايت اطلاع دهند


پاسخ

 

LinkBack ابزارهای موضوع
قدیمی Saturday 4 August 2007, 02:53 PM   #1
عضو ممتاز
 
cactus آواتار ها
 

تاریخ عضویت: October 11th, 2006
محل سکونت: تهرون
نوشته ها: 455

سطح دانش: 19 [♥ Bé-Yêu ♥♥ Bé-Yêu ♥♥ Bé-Yêu ♥]
سابقه در سایت: 0 / 469
قابليت: 151 / 3747
ميزان تجربه: 77%

Thanks: 21
Thanked 73 Times in 52 Posts
قدرت اعتبار: 3 cactus is on a distinguished road
Thumbs up آموزش ساخت تصاویر امنیتی

تصویر امنیتی چیست ؟
احتمالا شما در هنگام دانلود فایل یا هنگام ثبت نام در برخی از سایت ها درگیر پر کردن فرم های کوچک و بزرگی شده اید. در این فرم ها احتمالا با یک تصویری که در آن چند کاراکتر و یا عدد به شکلی سوال انگیز در کنار هم قرار گرفته است برخورد کرده اید.در کنار این تصاویر از شما خواسته شده است تا کاراکترهائی را که در تصویر مشاهده می کنید را در یک TextBox وارد کنید. اما این تصاویر به چه دردی می خورند ؟

کاربرد تصاویر امنیتی ؟
تصور کنید در سایت شما بخش نظرسنجی وجود دارد و در آن هر فرد مراجعه کننده به سایت (Anonymous) می تواند نظر خود را در آن وارد کند. شما چند راه برای این کار دارید یا تعداد نظراتی را که هر فرد می تواند ثبت کند را محدود سازید و یا اینکه هیچ محدودیتی وجود نداشته باشد. در صورتی که قصد محدود سازی کاربر را داشته باشید احتمالا به سراغ متغیر Session می روید و با الگوریتم خاص خود این مهم را انجام می دهید. مثلا کاربر را مجبور می کنید تا فقط در بازه های زمانی 10 دقیقه ای امکان ثبت را داشته باشد ! سناریو ای را در نظر بگیرید که چند کاربر که از یک PC استفاده می کنند و یا کاربری قصد ارسال دو نظر را دارد، احتمالا با خواندن سناریوهائی از این دست به شما عذاب وجدان دست خواهد داد. حال فرض کنیم شما راه حل دوم را انتخاب کنید و هیچ محدودیتی برای ورود اطلاعات در نظر نگیرید. سناریوای را در نظر بگیرید که در آن هکری با نوشتن یک برنامه ساده سعی می کند به سرعت در وب سایت شما مدام نظر ثبت کند. اگر هر رکورد جدول نظر شما 2092 بایت اشغال کند (2048 بایت برای نظر) و در هر 3 ثانبه (بهترین حالت برای شما و بدترین حالت برای هکر) بتواند یک رکورد ثبت کند. اگر بانک اطلاعاتی سایت شما 10mb فضای آزاد داشته باشد در عرض 4 ساعت بانک اطلاعاتی شما پر از اطلاعات هرزه می شود. احتمالا در بهترین حالت بین 3 تا 4 روز بانک شما پر است و تا آن زمان هیچ چیزی نمی تواند در بانک اطلاعاتی شما درج شود و چندین ساعت از وقت شما صرف پاک کردن اطلاعات هرزه می شود.

نحوه ساخت تصاویر امنیتی
روشی که در این مقاله برای ساخت تصاویر امنیتی استفاده شده است بدین شرح است که از طریق ایجاد یک لینک به HttpHandler تصویر امنیتی را نمایش می دهیم



همان طور که در تصویر مشاهده می شود از طریق پسوند ashx به HttpHandler تولید کننده تصویر امنیتی متصل شده و تصویر امنیتی را دریافت می کنیم. این تصویر امنیتی بر اساس مشخصات مورد نظر ما ایجاد می شوند. این مشخصات در ادامه ی پسوند ashx به عنوان Query و به صورت کاملا رمزنگاری شده تولید شده اند.





کلاس SecurityImage

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

کد:
if (!this.IsPostBack)
{
    SecurityImage simg = new SecurityImage(SecurityLevel.Low, 300, 50);
     simg.Generate();
    Session["simg_code"] = simg.Code;
    iLow.ImageUrl = simg.SecurityImageUri;
}
پارامترهای ورودی سازنده کلاس Security Image سطح امنیتی کد و اندازه تصویر خروجی را تعیین می کنند. متد Generate با هر بار فراخوانی یک کد جدید تولید می کند و به طبع آن SecurityImageUri و Code نیز تغییر می کند.
این کد را در هنگام Load شدن صفحه به کار گرفته و کد امنیتی ایجاد شده را در Session نگه داری می کنیم. بعد از اینکه کاربر فرم مورد نظر را پر کرده و پست می کند. می توان مقدار تایپ شده توسط کاربر را با اصل کد امنیتی موجود در Session چک کرده و در صورت صحت آن اطلاعات را ثبت کنیم.

مهمترین متد کلاس SecurityImage به شرح زیر است :

کد:
private string GenerateCode()
{
    Random r = new Random((int)DateTime.Now.Millisecond);
    int maxNumber = 0;
    int numberCodeQuantity = 0, alphabeticCodeQuantity = 0;
    string code = String.Empty;

    maxNumber = r.Next(6, 7);
    numberCodeQuantity = 1;
    if (SecurityLevel == SecurityLevel.Low)
        numberCodeQuantity = 5;
    else
        alphabeticCodeQuantity = maxNumber - numberCodeQuantity;

    for (int i = 1; i <= numberCodeQuantity; ++i)
    {
        code += ((char)r.Next(48, 57)).ToString();
    }
    for (int i = 1; i <= alphabeticCodeQuantity; ++i)
    {
        code += ((char)r.Next(65, 90)).ToString();
    }
    return code;
}
این متد عمل تولید کد امنیتی متناسب با سطح امنیتی تعیین شده انجام می دهد. پس از تولید کد باید اطلاعات شامل اندازه تصویر، سطح امنیتی تصویر و کد مورد نظر کد شده و به صورت یک Query درآیند.

کد:
public string Generate()
{
    byte[] IV = new byte[8] { 120, 34, 63, 127, 93, 240, 23, 232 };
    string cryptoKey = "GalaxyRoad2004@yahoo.com";

    _code = GenerateCode();
    byte[] codebytes = System.Text.Encoding.ASCII.GetBytes(_code);
    TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
    tripleDES.Key = md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(cryptoKey));
    tripleDES.IV = IV;
    byte[] codeBuffer = tripleDES.CreateEncryptor().TransformFinalBlock(codebytes, 0, codebytes.Length);
    string secretCode = Convert.ToBase64String(codeBuffer, 0, codeBuffer.Length);
    secretCode = HttpContext.Current.Server.UrlEncode(secretCode);
    string query = secretCode + "&" + Width.ToString() + "&" + Height.ToString() + "&" + SecurityLevel.ToString();
    byte[] queryBytes = System.Text.Encoding.ASCII.GetBytes(query);
    Random r = new Random((int)DateTime.Now.Millisecond);
    _simgUri = r.Next().ToString() + ".ashx?" + HttpContext.Current.Server.UrlEncode(Convert.ToBase64String(queryBytes, 0, queryBytes.Length));
    return _simgUri;
}
متد فوق این کار را برای ما انجام می دهد و اطلاعات مورد نظر را به صورت یک Query، رمز می کند و آن را در قالب یک Uri فایل تصویری jpg باز می گرداند.

در سمت سرور ما کلاس SecurityImageHandler را داریم که وظیفه ی Handler کردن درخواست های تصاویر امنیتی را بر عهده دارد. مهمترین متد این کلاس به شرح زیر است :

کد:
public void ProcessRequest(HttpContext context)
{
string secretString;
string code;
try
{
    secretString = context.Request.Url.Query.Substring(1);
    code = Decode(secretString);
}
catch (Exception)
{
    return;
}
Size size = new Size(300, 50);
Bitmap bmp = new Bitmap(size.Width, size.Height);
Bitmap result = new Bitmap(imageWidth, imageHeight);
Graphics g = Graphics.FromImage(bmp);
... 
result.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);
}
برای اختصار از آوردن کدهای تولید تصویر خودداری کردم. قبل از تولید تصویر کد امنیتی باید Query ارسال شده  Decode گردد که این عمل توسط متد زیر صورت می گیرد :

private string Decode(string secretCode)
{
    byte[] queryBytes = Convert.FromBase64String(HttpContext.Current.Server.UrlDecode(secretCode));
    string query = System.Text.Encoding.ASCII.GetString(queryBytes, 0, queryBytes.Length);
    string[] parameters = query.Split('&');
    imageWidth = int.Parse(parameters[1]);
    imageHeight = int.Parse(parameters[2]);
    ParseSecurityLevel(parameters[3]);
    byte[] codeBuffer = Convert.FromBase64String(HttpContext.Current.Server.UrlDecode(parameters[0]));
    byte[] IV = new byte[8] { 120, 34, 63, 127, 93, 240, 23, 232 };
    string cryptoKey = "GalaxyRoad2004@yahoo.com";
    TripleDESCryptoServiceProvider tripleDES = new TripleDESCryptoServiceProvider();
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

    tripleDES.Key = md5.ComputeHash(System.Text.Encoding.ASCII.GetBytes(cryptoKey));
    tripleDES.IV = IV;
    byte[] codebytes = tripleDES.CreateDecryptor().TransformFinalBlock(codeBuffer, 0, codeBuffer.Length);
    return System.Text.Encoding.ASCII.GetString(codebytes, 0, codebytes.Length);
}

کلاس SecurityImageSupplier
این کلاس برای انجام کارهای پایه ای برای تولید تصاویر امنیتی می باشد. لزومی ندارد کاربر با این کلاس کار کند و کلاس SecurityImage جوابگوی نیازهای کاربر می باشد.

کد:
public class SecurityImageSupplier : SecurityImageInfo
    {
        public SecurityImageSupplier()
        {
        }
        public SecurityImageSupplier(string code, int width, int height, SecurityLevel level)
        {
            _code = code;
            _width = width;
            _height = height;
            _level = level;
        }
        public SecurityImageInfo QueryDecode(string secretCode)
        {

    ... Decoding Query and parse private attributs

            return this;
        }

        public string QueryEncode()
        {
            return QueryEncode(_code, _width, _height, _level);
        }

        public string QueryEncode(string code, int width, int height, SecurityLevel level)
        {

... Create query and code it by parameters and initializing private attributes

        }

        public void WriteImageToStream(Stream output)
        {

... Create and draw security image

            result.Save(output, System.Drawing.Imaging.ImageFormat.Jpeg);
        }
    }
از این کلاس برای رسم تصویر در فایل SecurityImageGenerator.aspx استفاده شده است


کد:
protected void Page_Load(object sender, EventArgs e)
{
string query = Request.Url.Query;
query = query.Substring(1);

SecurityImageSupplier supplier = new SecurityImageSupplier();
supplier.QueryDecode(query);
Response.Clear();
supplier.WriteImageToStream(Response.OutputStream);
}
کد فوق شامل تمام عملیات رسم و تولید تصویر امنیتی می باشد. متدهای QueryDecode و QueryEncode همان وظایف گذشته را بر عهده دارند و فقط نام آنها تغییر کرده است.

کلاس SecurityImage
کلاس SecurityImage همان کلاسی ست که کاربر با استفاده از آن همانند روش قبل عمل تولید تصاویر امنیتی را انجام می دهد. البته تغییرات جزئی را ناچارا بر این کلاس اعمال کردم.

کد:
public class SecurityImage : SecurityImageInfo
    {

... Constructors

        public string Generate(SecurityLevel newLevel)
        {
            _level = newLevel;
            return Generate();
        }

        public string Generate()
        {

... Generate Code

            _code = code;
            SecurityImageSupplier supplier = new SecurityImageSupplier(_code, _width, _height, _level);
            _simgUri = "SecurityImageGenerator.aspx?" + supplier.QueryEncode();
            return _simgUri;
        }

    }
نحوه ی استفاده سریع
در این قسمت قصد دارم علاوه بر شرح نحوه استفاده کلاس SecurityImage برای تولید تصاویر امنیتی، طریقه ی استفاده از یک CustomValidator را برای بررسی صحت کد وارد شده توسط کاربر را نیز ذکر کنم. به کدهای زیر توجه فرمائید :

کد:
if (!this.IsPostBack)
        {
            SecurityImage simg = new SecurityImage(SecurityLevel.VeryHigh);
            simg.Generate();
            ViewState["rbVeryHigh"] = simg.Code;
            iVeryHigh.ImageUrl = simg.SecurityImageUri;

            MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
            byte[] securityCodeBytes = Encoding.ASCII.GetBytes(simg.Code.ToLower());
            byte[] hashedBytes = md5.ComputeHash(securityCodeBytes,0,securityCodeBytes.Length);
            string b64str = Convert.ToBase64String(hashedBytes,0,hashedBytes.Length);
            hiHashedSecurityCode.Value = b64str.Substring(0, b64str.Length - 2);
        }
برای تولید تصویر امنیتی همانند گذشته عمل کردیم با این تفاوت که به جای Session از ViewState برای نگاه داری کد امنیتی استفاده کرده ایم. در ادامه کد امنیتی تولید شده را توسط الگوریتم MD5 به صورت Hash در آورده و آن را درون یک HtmlInputHidden قرار دادیم. دقت کنید که اگر مقدار کد امنیتی را بدون تغییر درون این فیلد نگاه داریم آنگاه انگار که هیچ کار مفیدی تا کنون انجام نداده ایم.
فایل های SecurityImageGenerator.aspx، SecurityImage.dll و نیز md5.js (در صورت تمایل به استفاده از CustomValidator و نیز جهت کار با متدهای هش کننده md5 در سمت کلاینت) را به پروژه ی خود بیافزائید.
کدهای Javascript زیر را به صفحه اضافه می کنیم.

کد:
<script src="md5.js" language="javascript" type="text/javascript"></script>

    <script language="javascript" type="text/javascript">
        function SecurityImageValidator(sender,args)
        {
        if(b64_md5(args.Value.toLowerCase())==document.getElementById("hiHashedSecurityCode").value)
            args.IsValid=true;
         else
            args.IsValid=false;
            return args.IsValid;
        }
    </script>
مجددا توجه شما را به این مطلب جلب می کنم که کدهای فوق و نیز بخش دوم کدهای Server Side قبلی برای اضافه کردن CustomValidator می باشد و در صورتی که شما مایل به استفاده از آن نیستید نباید این کدها را به صفحه ی aspx خود اضافه کنید.

یک RequiredFieldValidator و یک عدد CustomValidator را چاشنی وب فرم خود کنید و برای خصوصیت ClientValidationFunction کنترل CustomValidator مقدار SecurityImageValidator را وارد نمائید. این باعث می شود تا قبل از PostBack صفحه فانکشن جاوااسکریپت فوق اجرا شود و Validation آن از طریق این Function چک شود.

در نهایت فرم شما باید شکلی شبیه به شکل زیر باشد




و در نهایت کدهای زیر را به عنوان آخرین کدهای آزمایش صحت Security Code در هنگام پست شدن صفحه و قبل از انجام هر عملیاتی قرار می دهیم :

کد:
 protected void Check_Click(object sender, EventArgs e)
    {
        bool correct = false;
        if (ViewState["rbVeryHigh"].ToString().ToLower().Equals(tbCode.Text.ToLower()))
            correct = true;
        if (correct)
            Response.Write("<h1>Success !!</h1>");
        else
            Response.Write("Failed.");

    }
توجه : نباید فقط به قرار دادن یک CustomValidator اکتفا کرد و حتما می بایست مجددا آزمون برابر اصل بودن Security Code را درسمت سرور انجام داد.

موفق باشید !!
منبع : برنامه نویس !
__________________
Any Question About Web Programming Like HTML,DHTML,ASP,ASP.NET,SQLSERV ER,JAVASCRIPT
Dont waste time ! CACTUS is here


افلاطون مي گه: " اگه با دلت چيزي يا کسي رو دوست داري زياد جدي نگيرش، چون ارزشي نداره، چون کار دل دوست ‏داشتنه، مثل کار چشم که ديدنه، اما اگه يه روز با عقلت کسي رو دوست داشتي، اگه عقلت عاشق شد، بدون که داري ‏چيزي رو تجربه مي کني که اسمش عشق واقعيه هوسبازان وقتی زیبایی را می بینند،دوستشان دارند. ولی عاشقان وقتی كسی را دوست داشته باشند،زیبا می بینن
View cactus's Photo Album cactus آفلاين است   پاسخ با نقل قول
پاسخ

برچسب ها
آموزش , امنیتی , تصاویر , ساخت

ابزارهای موضوع

مجوز های ارسال و ویرایش
شما نمیتوانید موضوع جدیدی ارسال کنید
شما امکان ارسال پاسخ را ندارید
شما نمیتوانید فایل پیوست در پست خود ضمیمه کنید
شما نمیتوانید پست های خود را ویرایش کنید

BB code is فعال
شکلک ها فعال است
کد [IMG] فعال است
کد HTML غیر فعال است
Trackbacks are فعال
Pingbacks are فعال
Refbacks are فعال



اکنون ساعت 08:56 AM برپایه ساعت جهانی (GMT - گرینویچ) +4.5 می باشد.


Powered by vBulletin
Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.

Skin developed by: ParsDVB


نقل مطالب سايت با ذکر منبع (http://drdvb.com) و نام نويسنده مجاز است. مسئوليت پستها بر عهده نويسنده آن است و سايت parsdvb به هيچ عنوان در قبال نوشته‌های ديگران مسئوليتی ندارد.
 

تمامي قوانين اين سايت از جمهوري اسلامي ايران پيروي مي کند و هرگونه مطالب مخالف قوانين ايران و بنر يا لينک مستهجن در اين سايت جايي ندارد

website monitoring service check web page

    

100
Search 2

parsdvb satdw skynet skynet جدید skystar3 tps.bin vplug vplug جدید vpnمجانی zeeaflam آموزش لب گرفتن استارست اموزش لب گرفتن انتخاب رشته مجازي ترانه ی مادری ثبت نام فيات ثبت نام فیات حسین استیری دانلود نرم افزار ویروس ساز دانلود ويروس ساز رضایا ساسي مانكن ساسی مانکن سریال ترانه ی مادری عکس دختر عکس لب عکس لب گرفتن فركانس شبكه هاي استاني فركانس ماهواره فرکانس فرکانس شبکه های استانی فرکانس ماهواره فرکانسهای ماهواره فيات فيات سينا فیات فیات سینا لب لب گرفتن مجله تپش منصور حیدری مولتی ویژن همسر خسرو شكيبايي همسر خسرو شکیبایی پخش افتتاحیه المپیک پخش المپیک پخش زنده ماهواره پوریا شکیبایی کانالهای پخش المپیک یاسر محمودی ... powered by Search 2
Google
جستجو در گوگل جستجو درانجمنهای آموزشی پارس