مثالهای سی شارپ (C# Saples)

ADO.NET

String Formatting

Files and Folders

XML

Reflection

Network and Sockets

Threading

Windows Forms

Windows Services

Printing

Arrays and Collections

Conversions

Other

ذخیره اطلاعات حساس کاربران بصورت کدگذاری شده در ASP.NET

ذخیره اطلاعات حساس کاربران بصورت کدگذاری شده

در اين مقاله در رابطه با کدگذاری اطلاعات حساس کاربران سایت مانند کلمه عبور و شماره کارت اعتباری صحبت می کنیم.


یکی از مسائل مهم امنیتی در پروژه های بزرگ مبتنی بر وب کد کردن اطلاعات حساس کاربران می باشد. این اطلاعات می تواند شامل کلمه عبور و یا شماره کارت اعتباری آنها باشد.
حتما" در سایت های بزرگی مانند یاهو مشاهده کردید که در بخش درخواست کلمه عبور به هیچ عنوان امکان ارسال کلمه عبور قدیمی شما وجود ندارد. دلیل این مطلب آنست که تمامی کلمات عبور کاربران توسط الگوریتم های کدگذاری یک طرفه، رمزنگاری شده اند، به شکلی که حتی اگر کسی دسترسی تمام به بانک اطلاعاتی پیدا کند توان استفاده از حساب کاربران سایت را ندارد.
در این مقاله به کمک الگوریتم
MD5 کلاسی تهیه می کنیم که یک رشته را بعنوان ورودی دریافت و یک رشته با طول 16 را بصورت کد شده تحویل ما دهد. از این کلاس می توانیم بعنوان بخشی از سطح امنیتی در پروژه هایمان استفاده کنیم.

MD5 :
یک الگوریتم کار آمد رمز سازی است که در بسیاری از زبانهای برنامه نویسی دیگر نیز وجود دارد. MD5 عضوی با نام ComputeHash دارد که یک تابع Hash یا (Hash function) است.
توابع Hash یا (Hash functions) یک binary string با طول دلخواه را به یک binary string با طول کوتاه و ثابت تبدیل می کند، و این خاصیت را دارد که هرگز برای دو ورودی مجزا یک خروجی یکسان وجود نخواهد داشت (به عبارت دیگر توابع Hash تضمین میکنند که هر ورودی خروجی منحصر به فردی را داشته باشد).

برای ساخت کلاس فوق الذکر احتیاج به اضافه کردن دو فضا نام داریم که عبارتند از :

using System.Text;
using System.Security.Cryptography;

ساخت تابع رمز ساز :

public static byte[] computeMD5Hash(string InputString)
{
     byte[] MDH = new byte[16];
     UTF8Encoding encoder = new UTF8Encoding();
     MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
     MDH = md5Hasher.ComputeHash(encoder.GetBytes(InputString));
     return MDH;
}

شما کد کامل این کلاس را می توانید از قسمت دریافت کد در انتهای همین مقاله دریافت کنید.

نحوه استفاده از این کلاس :
برای استفاده از این کلاس در پروژه های خود، کافیست فایل ClsCrypt.cs را به پوشه
App_code منتقل سازید و در هر قسمت از سطوح برنامه که احتیاج به کدگذاری داشتید از دستور زیر استفاده کنید :

ClsCrypt.computeMD5Hash(TextBox1.Text);

توجه داشته باشید از آنجایی که computeMD5Hash بصورت static تعریف شده است احتیاجی به ایجاد ClsCrypt در برنامه نیست.
همچنین در صروتی که برای کد کردن اطلاعات کاربران (مانند کلمه عبور) از این تکنیک استفاده می کنید ، زمان اعتبار سنجی نیز مقدار وارد شده توسط کاربر را ، بویسله روشی که توضیح داده شد کد کرده و سپس با مقدار ذخیره شده در بانک اطلاعات مقایسه کنید.

نکته :
از آنجایی که کلاس فوق الذکر تمام رشته های ورودی (با هر طولی) را در نهایت به یک  رشته کد شده با طول 16 تبدیل می کند پیشنهاد می کنیم فیلد موزد نظر در بانک اطلاعاتی از نوع
Binary با طول 16 انتخاب شود.

دانلود فایل ضمیمه | دریافت کد

منبع: http://aspcode.ir/Article.aspx?id=12

برخورد مناسب با خطاهای مدیریت نشده در ASP.NET

برخورد مناسب با خطاهای مدیریت نشده

در اين مقاله سعی داریم با نوشتن یک روتین در فایل Global.asax ، خود را از خطاهای احتمالی برنامه در حین بازدید مطلع سازیم و همچنین کاربر را به صفحه ای مناسب هدایت کنیم.


یکی از مسائل مهم امنیتی در پروژه های بزرگ مبتنی بر وب مدیریت و برخورد مناسب با خطاهای برنامه است که در حین بازدید به هر دلیلی رخ می دهد. یکی از راه های مقابله با خطاها که نزد برنامه نویسان ایرانی بسیار متداول شده است استفاده از ساختار سعی و خطا یا همان Try & Catch می باشد.
مهمترین دلیل برای عدم استفاده از این روش ، در اختیار قرار دادن اطلاعات مهمی است که این شیوه در اختیار بازدید کننده قرار می دهد. (مانند ساختار درخواست
Sql و نام بانک اطلاعاتی ، نام جداول و حتی فیلد ها و ... ).
موضوع فوق الذکر تنها یکی از مواردی است که ما را مجبور به ارائه راه حلی برای مقابله صحیح با خطاهای برنامه می کند.
مسأله دیگر اتفاقات اخیر برای همین سایت
Aspcode.Ir بود که تعدادی از کاربران به بنده ایمیل زدند و از سیستم ثبت نام سایت که ختم به صفحه پیغام خطا می شد شکایت داشتند.
خیلی فکر کردم در رابطه با پیدا کردن مشکل اما کد برنامه کاملا" بی نقص بود و من هم تا به حال با مشکلی که کاربران سایت مطرح می کردند مواجه نشده بودم !
در نهایت تصمیم گرفتم با کمی کد نویسی رد کاربران خود را بگیرم.

مقابله با خطاهای مدیریت نشده برنامه
شما با کد نویسی رویداد Application_Error در فایل Global.asax
می توانید تمام خطاهایی که در برنامه بوسیله ساختار Try & Catch مدیریت نشده اند را مدیریت کنید.

void Application_Error(object sender, EventArgs e)
{
      // Code that runs when an unhandled error occurs
}

برای این منظور کد نویسی رویداد Application_Error  را به سه بخش تقسیم می کنیم.

1- دریافت جزییات خطا (از جمله نام صفحه ، آدرس صفحه و مقدار
query String ، علت خطا و...) :

string ErrorMessage = "Application Error ... \n\n";
//Path And Name Of The Page
ErrorMessage += "Page : " + Request.Path;
//Url Query String
ErrorMessage += "\n\nQuery String : " + Request.RawUrl;
//Last Error Exception Object & Error Message
Exception myex = Server.GetLastError();
ErrorMessage += "\n\nError Message : " + myex.Message.ToString();
//Source Of The Error Message
ErrorMessage += "\n\nError Source : " + myex.Source;
//Stack Trace Of The Error
ErrorMessage += "\n\nError Stack Trace : " + myex.StackTrace;
//Method Where The Error Occurred
ErrorMessage += "\n\nError Target Site : " + myex.TargetSite;
//Date Time
ErrorMessage += "\n\nDateTime : "+ DateTime.Now.ToString();

در کد فوق متغیر رشته ای را با نام ErrorMessage  برای نگهداری جزییات خطا در نظر می گیریم. همانطور که از توضیحات موجود بالای هر دستور مشخص است بصورت مرحله به مرحله از نام صفحه تا تاریخ و زمان رخ دادن خطا را به مقدار ErrorMessage الحاق می کنیم. حتی آدرس IP کاربر و دیگر موارد را می توان به کد فوق افزود.

2- ارسال متن خطا به ایمیل مدیر سایت :

//Send Email
EmailCls.SendNew(ErrorMessage);  //ErrorMessage پارامتر ورودی و متن نامه ارسالی

در این مرحله خطا را به کمک دستور فوق به ایمیل خود ارسال می کنیم. EmailCls کلاس ساده ایست به منظور ارسال ایمیل که می توانید آن را از قسمت دریافت کد ، در انتهای همین مقاله دریافت کنید. (توضیح در رابطه با نحوه ارسال ایمیل را در آینده ای نزدیک می توانید در بخش مقالات با موضوع کلیات Asp.Net مطالعه فرمایید).

3- هدایت کاربر به صفحه ای مناسب که شامل پیغامی جهت تلاش دوباره است :

Response.Redirect("err.aspx");

دانلود فایل ضمیمه | دریافت کد

منبع http://aspcode.ir/Article.aspx?id=13

چگونگی بازنویسی آدرس ها (UrlRewriting)  در ASP.NET

چگونگی بازنویسی آدرس ها (UrlRewriting)

بازنویسی آدرس ها در ASP.NET یکی از موارد پرکاربرد امنیتی است که فوايد زیادی دارد. سهولت ایندکس شدن سایت توسط موتور های جستجو ، مخفی کردن Query String و نمایش ظاهری یک سایت پویا به صورت ایستا و بالا بردن امنیت نسبی سایت از مهمترین این فواید هستند. در این مقاله سعی می کنیم بصورت مختصر و مفید چگونگی بازنویسی آدرس ها را در ASP.NET توضیح دهیم.

 

کار UrlRewriting تبدیل یک آدرس اینترنتی واضح و با معنا به یک آدرس واقعی دارای Query String جهت تفسیر موتور Asp.net است. دو آدرس زیر را در نظر بگیرید :

http://aspcode.ir/article.aspx?id=4&type=print

http://aspcode.ir/article-4-print.html

یقینا" آدرس دوم با معنی تر از آدرس اول است.در ضمن تا حدودی امکان هک شدن سایت از طریق تزریق عبارات Sql را کاهش می دهد. اجازه دهید ابزار های موجود برای UrlRewriting را بررسی کنیم.

بعد از ظهور Asp.net 2.0 خبر پشتیبانی استاندارد این تکنولوژی از UrlRewriting بسیار جالب توجه بود. برای این منظور در Asp.net 2.0 تنها کافیست مقداری تغییر در Web.Config دهید :

 
                    mappedUrl="~/show.aspx?id=5" />

دقت فرمایید تنظیمات فوق متعلق به شاخه می باشد و باید در این بخش از Web.Config تعریف شود. در مثال بالا url آدرسی است که کاربر مشاهده می کند و mappedUrl آدرس حقیقی ماست. اما همانطور که از ظواهر امر پیداست این روال کاری، تنها برای مواقعی مفید خواهد بود که تعداد دفعات استفاده محدود باشد و در صورتی که تعداد آدرس ها بالا باشد ، مدیریت آنها بسیار کار مشکل و زمانبری خواهد بود.

برای حل این مشکل ابزار های دیگری در دسترس برنامه نویسان قرار گرفته است. یکی از بهترین ابزار ها را می توان در سایت www.UrlRewriting.net یافت. جهت استفاده از این ابزار که Open Source هم می باشد ، می توانید مستندات آن و تمام آنچه که نیاز دارید از آدرس فوق دانلود کنید.
هر چند که مستندات و مطالب ارائه شده در سایت فوق کاملا" جامع است ، ولی در ادامه این مقاله، توجه شما را به مثال هایی از UrlRewriting در Asp.net جلب می کنم.

ابتدا فایل ضمیمه مقاله را دریافت کنید و Intelligencia.UrlRewriter.dll را به پوشه Bin پروژه خود انتقال دهید. حال مراحل زیر را جهت بازخوانی یک آدرس ثابت دنبال کنید :

فایل Global.asax را باز و
رویداد Application_BeginRequest را بصورت زیر کد نویسی می کنیم. همانطور که از نام این رویداد پیداست زمانی کد اجرا می شود که درخواستی به سمت موتور Asp.net ارسال شود.

if (Request.Url.ToString().Contains("show.htm"))
{
      Context.RewritePath("show.aspx");
}

در این مثال محتوای صفحه ای با نام show.htm که بصورت مجازی ایجاد شده است و وجود خارجی ندارد از صفحه ای دیگر با نام show.aspx خوانده می شود.
سپس فایل web.config را باز و محتوای آن را به صورت
زیر تنظیم نمایید :

پروژه های دانشگاهی در www.bitasoft.ir
-

لطفا" به محل قرار گرفتن تغییرات دقت ویژه ای داشته باشید :

داخل تگ قرار گیرد.
داخل تگ قرار گیرد.
:
داخل تگ و خارج و بعد از تگ قرار گیرد.

توجه فرمایید کد کامل برنامه را نیز می توانید در انتهای برنامه دانلود نمایید.

مخفی کردن Query String :
شاید به ذهن شما رسیده باشد که چگونه می توان آدرس های مجازی
دارای Query String را نیز بازنویسی کنیم. این کار نیز بسیار ساده است و تفاوتهای جزئی با مثال بالا دارد.
برای اینکار
دوباره فایل Global.asax را باز و رویداد Application_BeginRequest را بصورت زیر کد نویسی می کنیم :

if (Request.Url.ToString().Contains("show-(.+).htm"))
{
      Context.RewritePath("show.aspx?id=$1");
}

علامت (.+) نماینده یک متغیر است که مقدار Query String را می گیرد و $1 در خط بعدی همان مقدار (.+) و نماینده مقدار Query String در آدرس حقیقی است. همچنین تگ rewrite را بصورت زیر تغییر دهید :

در صورتی که آدرس شما دارای بیش از یک پارامتر Query String است (برای مثال سه پارامتر) بصورت زیر عمل کنید :

show-(.+)-(.+)-(.+).htm
Show.aspx?Page=$1&Id=$2&state=$3

همچینین تگ rewrite را مانند مثالها قبلی تغییر دهید.
فکر می کنم با مثال های متعدد در این مقاله، شما این مهارت را پیدا کرده باشید تا  آدرس ها را بصورت مجازی ایجاد کنید.

نکته :

دقت کنید که در بازخوانی
آدرسهای با چندین پارامتر Query String در قسمت آدرس حقیقی قبل از & ، amp; را قرار دهید. در ضمن برای بازخوانی مقدار Query String نیاز به کد نویسی خاصی نیست و با در نظر گرفتن مثال فوق بعد از UrlRewriting با دستور زیر در صفحه show.aspx می توانیم مقدار Query String را بخوانیم :

Response.Write((string)Request.QueryString["id"]);

دانلود فایل ضمیمه | دریافت کد

ایجاد تصاویر امنیتی حاوی متن اتفاقی (CAPTCHA) )

ایجاد تصاویر امنیتی حاوی متن اتفاقی (CAPTCHA) - تصاویر انسان یاب
ایجاد تصاویر امنیتی که متن اتفاقی را در هر بار باز شدن صفحه نمایش می دهند یکی از ابزار های جلوگیری از برخی حملات است که توسط Robot هایی انجام می پذیرد که فرم های سایت شما را بصورت خودکار طی مدت زمان کوتاهی بار ها submit می کنند. در این مقاله روشی جهت ساخت اینگونه تصاویر بیان می شود که فوق العاده آسان و کاربردی خواهد بود.

معرفی CAPTCHA
CAPTCHA مخفف Completely Automated Public Turing Test To Tell Computers And Humans Apart  بوده و  به معنی تصدیق این امر که داده دریافتی توسط یک انسان ایجاد شده است.

این مقاله به ارائه یک راه حل بسیار آسان و قابل فهم ، جهت ساخت تصاویر امنیتی و استفاده از این تکنیک می پردازد. برای این منظور باید تصویری بصورت داینامیک ایجاد شود که نشان دهنده متن اتفاقی باشد. کاربر با مشاهده این تصویر ، متن درون آن را وارد کرده و امکان ارسال فرم برای او فراهم می شود. در واقع تا زمانی که متن صحیح وارد نشود فرم ارسال نمی شود.

در این روش ما یک صفحه aspx معمولی داریم که در رویداد Load این صفحه تصویر را ایجاد می کنیم و متن اتفاقی را پس از نوشتن روی تصویر، در Session ذخیره می کنیم تا در صفحه های مورد نیاز با مقایسه مقدار وارد شده توسط کاربر و این Session فرم های برنامه را مدیریت کنیم. 

برای این منظور ابتدا فضا نام های زیر را به صفحه خود اضافه کنید :

using System.Drawing;
using System.Text;

 سپس رویداد Load صفحه را بصورت زیر کد نویسی کنید :

SecureImage.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
      //ایجاد شیء گرافیک و دیگر ملزومات
      Bitmap objBMP = new System.Drawing.Bitmap(60, 20);
      Graphics objGraphics = System.Drawing.Graphics.FromImage(objBMP);
      objGraphics.Clear(Color.Green);
      objGraphics.TextRenderingHint = System.Drawing.Text.``TextRenderingHint.AntiAlias;

      //تنظیم فونت نوشته روی عکس
      Font objFont = new Font("Arial", 11, FontStyle.Bold);

      //ساخت رشته تصادفی 5 رقمی
      string randomStr = "";
      Random autoRand = new Random();
      randomStr = Convert.ToString(autoRand.Next(12345,99999));

      //اضافه کردن متن در جلسه
      Session.Add("randomStr", randomStr);

      //نوشتن متن
      objGraphics.DrawString(randomStr, objFont, Brushes.White, 6, 3);

      //تنظیم نوع عکس و برگرداندن آن به عنوان خروجی
      Response.ContentType = "image/GIF";
      objBMP.Save(Response.OutputStream,System.Drawing.Imaging.ImageFormat.Gif);

      //آزاد کردن منابع
      objFont.Dispose();
      objGraphics.Dispose();
      objBMP.Dispose();
}

در صورتی که این صفحه را اجرا کنید آنچه مشاهده می کنید یک تصویر با پس زمینه سبز است که عددی 5 رقمی را نشان می دهد. با Refresh کردن صفحه متن درون تصویر تغییر می کند.
حال کافیست در فرم خود یک کنترل
Image قرار دهیم و مقدار فایل منبع آن را برابر SecureImage.aspx انتخاب کنیم.

همچنین یک TextBox هم به فرم اضافه می کنیم تا کاربر متن درون تصویر را در آن وارد کند.
قطعه کد  زیر جهت بررسی مقدار وارد شده پیشنهاد می شود :

if ((string)Session["randomStr"] == TextBox1.Text.Trim())
{
      //Submit Form
}
else
{
      //Show Error - Please Enter Security Code that show in Image
}

این مطلب از آدرس  http://aspcode.ir/Article.aspx?id=18 به اینجا منتقل شده است. انشالله حلال نماید. فــــــــــــــــــــــــــاتـــــــــــحــــــــــــــــــــــــــــــه مـــــــــع الـــــصـــــــــــلـــــــــــــوات