برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

برترین مقالات کامپیوتر

انواع رابطه ها در پایگاه داده

 

» همانگونه که میدانید یک فیلد می تواند از چندین رکورد و یک جدول از چند فیلد تشکیل شود ، با توجه به این مطلب یک پایگاه داده هم میتواند دارای چندین جدول باشد . حال هر یک از این جدول ها می توانند اطلاعاتی را در خود ذخیره کنند که با جدول دیگری در ارتباط باشد یا این که هیچگونه ارتباطی را بین آنها قایل نشویم . برای مثال ما جدولی داریم مخصوص نگهداری اطلاعات فردی افراد و در جدول دیگری اطلاعات مالی این افراد را نگهداری میکنیم . بدون شک باید بین این دو جدول ارتباطی وجود داشته باشد تا ما تشخیص دهیم که کدام اطلاعات مربوط به کدام فرد است . وظیفه برقراری این ارتباط بر عهده فیلد کلید یا ( Primary Kay )است که خود ما آن را تعیین میکنیم .

 

» معمولا هر جدول یک فیلد موسوم به فیلد کلید KeyField دارد که از آن برای حفظ یکپارچگی پایگاه داده و برقراری رابطه با جدول های دیگر استفاده می کند . هر جدول می تواند فقط یک فیلد کلید یا کلید اولیه داشته باشد ، ولی می تواند دارای چند فیلد خارجی Foreign Key باشد . نحوه نمایش داده ها را فیلد کلید اصلی کنترل می کند و از فیلد خارجی برای مرتب کردن جدول با جدول های دیگر استفاده می شود .

 

» برای ایجاد ارتباط بین جدول ها در محیط Access شما باید از منوی Tools گزینه Relationships را انتخاب کنید و پس از انتخاب جدول ها خواهید توانست بین آنها توسط فیلدهای کلید ارتباط با معنی ایجاد کنید .

 

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

 

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

 

 

 

» رابطه یک به چند : در این نوع ارتباط فیلد اشاره گر می تواند به چند رکورد در جدول های دیگر اشاره کند یا این که برای هر رکورد موجود در فیلد کلید اصلی چند رکورد متناظر با آن در جدول های دیگر موجود باشد .

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

 

نکته : ارتباط یک به چند مهمترین و پر کاربرد ترین ارتباط موجود در میان جدول ها محسوب میشود .

 

 

 

» رابطه چند به چند : به دلیل این که این نوع ارتباط پیچیدگی زیادی داشته و در مواقع بسیار استثنایی از آن استفاده می شود و خوب ، البته من هم آشنایی چندانی یا بهتر بگم هیچ آشنایی با این نوع رابطه ندارم از شرح آن خود داری میکنم . امیدوارم که منو درک کنید .

 

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

هش چیست؟

هش (Hash, Hash Code, Digest, Message Digest هم نامیده می شود) را می توان به صورت اثر انگشت دیجیتالی یک داده در نظر گرفت. با این روش شما می توانید رشته ای اندازه-ثابت (fixed length) از یک داده به دست آورید که با روش های ریاضی به صورت "یک طرفه" رمزنگاری شده است. کشف رشته اصلی از رشته هش آن (عملیات معکوس) به صورت کارا تقریبا  غیر ممکن است. نکته دیگر اینکه هر داده یک رشته هش شده کاملا  منحصر به فرد ایجاد می کند( احتمال یکی شدن رشته های هش دو رشته متفاوت در الگوریتم MD5 یک در 3.4028236692093846346337460743177e+38 می باشد..  این خواص ، هش کردن را به روشی کارا و ایده آل برای ذخیره سازی کلمات عبور در برنامه های شما تبدیل می کند. چرا؟ برای این که حتی اگر یک نفوذگر(Hacker) بتواند به سیستم و بانک اطلاعاتی شما نفوذ کند و بخشی از اطلاعات شما را به دست آورد (شامل کلمات عبور هش شده) نمی تواند کلمات عبور اولیه را از روی آن ها بازیابی کند.

 

 

یکی از دو خصوصیت الگوریتم های   HASHاینه که معکوس پذیر نیستند! دومی اینه که هرگز دو ورودی متفاوت به خروجی یکسان منجر نمی شوند. هر یک از این دو خصوصیت اگر نقض بشه می گیم الگوریتم شکسته!!!

 

 

شناسایی اعضا با استفاده از Hash  

تا کنون نشان داده ایم که بازیابی کلمه عبور اصلی از روی رشته هش تقریبا غیر ممکن است ، خب چگونه برنامه های ما تشخیص دهند که کلمه عبور وارد شده توسط کاربر صحیح است ؟ به سادگی ! با تولید رشته هش کلمه عبور وارد شده توسط کاربر و مقایسه آن با رشته هش ذخیره شده در رکورد  بانک اطلاعاتی مربوط به کاربر می توانید متوجه شوید که آیا دو رشته با هم برابرند یا نه. بگذارید با ذکر یک مثال این بحث را ادامه دهیم.

 

 

 

 

 

 

 

Hashes are "digests", not "encryption"

Hash یک عمل خلاصه سازی (digest ) را روی جریان  ورودی انجام می دهد نه یک عمل رمز نگاری (encryption) .

Encryption داده را از یک متن صریح (Clear text) به یک متن برمز در آورده تبدیل می کند (Cipher text). encryption  ک عمل دو طرفه می باشد . که هرچه حجمClear text  بیشتر باشد حجم Cipher text نیز بیشتر می شود.

که این ارتباط در شکل زیر به خوبی بیان شده است:

 

 Encryption - a two-way operation

Hashe ها جریان داده ورودی را به یک خلاصه کوچک تبدیل می کنند. که این یک عمل یک طرفه(غیر قابل بازگشت) می باشد. و  جریان داده ورودی آنها با هر حجمی که باشد خروجی یک مقدار ثابت میشود.

شکل بعدی این ارتباط را در خلاصه سازی توسط الگوریتم  MD5  به خوبی نشان می دهد.

 

 

Hashing - a one-way operation

 

 

موارد استفاده از Hash  ها

Hash ها کلا موارد استفاده کمی دارند که ما در ادامه بحث آن ها را بیان می کنیم:

1. تشخیص درستی یک فایل Verifying file integrity

برای مثال زمانی که یک فایل با حجم بالا را دانلود می نماییم می توانیم با به دست آوردن مقدار MD5 آن فایل توسط دستور md5sum  و مقایسه آن  با مقدار Md5  داده شده توسط سایت مورد  نظر  از درستی فایلمان اطمینان حاصل کنیم.

2.hash  کردن کلمه عبور Hashing passwords

قبلا به طور مفصل بحث شد.

 

3. نشانه گذاری  اسناد به روش digitally (امضاهای digitally)

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

 

 

 

 

Collision (تصادم) در Hash

زمانی که مقدار  Hash  دو ورودی متفاوت یکسان باشند می گوییم Collision  رخ داده است.

 

اما تا کنون هیچ موردی از Collision دیده نشده است . این امر از این حقیقت  ناشی می شود که تعداد مقادیر یک الگوریتم  hash بسیار زیاد می باشند.برای مثال یک Hash  128 بیتی میتواند 3.4 x 1038

مقدار ممکن داشته باشد.که معادل 340,282,366,920,938,463,463,374,607,431,768,211,456 میباشد.

 

انواع هش

  • MD4 (128 bits, obsolete)
  • MD5 (128 bits)
  • RIPEMD-160 (160 bits)
  • SHA-1 (160 bits)
  • SHA-256, SHA-384, and SHA-512 (longer versions of SHA-1, with slightly different designs)

 

انواع مختلفی از الگوریتم های قوی هش کردن برای استفاده در برنامه های کاربردی موجود هستند، محبوب ترین آنها که مورد استفاده برنامه نویسان هستند MD5 و SHA-1(Secure hash algorithm)می باشند. سیستم های قدیمی تر از( DES(Data Encryption Standard استفاده می کردند. این روش 56 بیتی دیگر  یک روش قوی هش کردن محسوب نمی گردد. ، الگوریتم های قوی تری مانند SHA-256 و SHA-512  برای موارد خاص مانند امضاهای دیجیتالی توصیه می گردد ولی برای هش کردن کلمات عبوردر برنامه های امروزی SHA-1 هنوز سطح امنیت بسیار خوبی را فراهم می کند.

 

Hash Table

همانطور که در جستجوی دودویی دیده شد با استفاده از یک ساختمان داده به خصوص به اسم درخت جستجوی دودویی کارایی جستجو را بهبود بخشید یم.

 رسیدیم. O(logn) به جستجوی دودویی با O(n) در واقع از جستجوی خطی با

حال می خواهیم یک ساختمان داده جدید به نام جدول هش را معرفی کنیم که کارایی عمل جستجو را تا افزایش می دهد.O(1)

یک جدول هش از دو قسمت تشکیل شده : یک آرایه (جدول واقعی جایی که دادهایی که جستجو می شود  ) که به آن تابع هش می گویند.mapping function در آن ذخیره می شود ) و یک تابع  نگاشت (

اندیس های آرایه که  (integer space ) تابع هش نگاشتی است از فضای ورودی به فضای اعداد صحیح را مشخص می کند . به عبارت دیگر تابع هش روشی را فراهم می کند  برای اختصاص دادن اعداد به داده های ورودی به گونه ای که سپس داده  ورودی می تواند در اندیس آرایه مطابق باعدد تخصیص داده ذخیره شود.در ادامه مثالی در این رابطه  بیان می کنیم:

مثال را آغاز می کنیم. یعنی از رشته ها به عنوان داده هایی ابتدا با یک آرایه جدول هش از رشته ها که ذخیره و جستجو می شوند استفاده می کنیم . اندازه جدول هش را در این مثال 12 می گیریم.

 

The empty hash table of strings

در مرحله بعد ما به یک تابع هش نیاز دارم. راههای زیادی برای ساختن یک تابع هش وجود دارد. در حال حاضر یک تابع هش ساده را در نظر می گیریم. که یک رشته را به عنوان ورودی میگیرد. مقدار هش برگشتی از تابع برابر مجموع  کاراکتر های اسکی است که رشته ورودی را می سازند به پیمانه اندازه جدول:

int hash(char *str, int table_size)
{
               int sum;
 
               /* Make sure a valid string passed in */
               if (str==NULL) return -1;
 
               /* Sum up all the characters in the string */
               for( ; *str; str++) sum += *str;
 
               /* Return the sum mod the table size */
               return sum % table_size;
}

  اجرا می کنیم که مقدار 3 حاصل می شود.("Steve",12) تابع هش را باپارامتر های

.  را در جدول ذخیره می کنیم Steve  حال رشته

The hash table after inserting "Steve"

 

   اجرا میکنیم("Spark",12) تابع هش را با پارامتر های ."Spark"  بیایید رشته دیگری را امتحان کنیم:

که عدد 6 حاصل می شود. سپس آن را نیز در جدول ذخیره میکنیم.

The hash table after inserting "Spark"

  اجرا میکنیم . که این بار نیز مقدار 3 حاصل می شود.("Notes",12)  حال تابع هش را با پارامتر های

را نیز در جدول درج می کنیم. Notesرشته

 

A hash table collision

مشاهده می شود که  دو ورودی متفاوت مقدارهش  یکسانی دارند و هر دو عنصر باید در یک مکان در آرایه درج شوند که این مساله غیر ممکن است . و همانطور که قبلا نیز ذکر شد به این مساله تصادم گفته (linear probing) می شود. در رابطه با تصادم الگوریتم های زیادی وجود دارد از قبیل اکتشاف خطی  و زنجیرسازی جداگانه.

بررسی می کنیم. ر ا  (Separate Chaining) که ما در اینجا زنجیره سازی جداگانه

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

بیایید مثال بالا را این بار با ساختمان داده تغییر یافته مان بررسی نماییم :

Modified table for separate chaining

 

 

دوباره  Steve را با مقدار هش 3 به جدولمان اضافه میکنیم:

After adding "Steve" to the table

هم چنین Spark با مقدار هش 6 را نیز به جدولمان اضافه می کنیم:

After adding "Spark" to the table

حال Notes با مقدار هش 3 (همانند مقدار هش Steve) را اضافه می کنیم:

Collision solved - "Notes" added to table

 

مراحل جستجو مشابه با عمل درج در جئول می باشد. ما مقدار هش داده ای را که می خواهیم جستجو شود  را به دست می آوریم. سپس به ان مکان از آرایه می رویم. لیستی که از آن مکان سرچشمه می گیرد (آغاز میشود) را بررسی می کنیم. و می بینیم که چیزی که به دنبال آن هستیم در لیست وجود دارد یا نه .

=>تعداد مراحل O(1) می باشد.

زنجیره سازی جداگانه Separate chaining)  ) به ما این امکان را می دهد که مساله تصادم را در یک روش ساده و قدرتمند حل نماییم . با این حال هنوز مشکلاتی وجود دارد . حالتی را فرض کنید که تمام داده های ورودی دارای یک مقدار هش باشند. در این مورد برای جستجوی یک داده باید یک جستجوی خطی با O(n) در لیست  پیوندی انجام دهیم .  پس در بدترین حالت این روش O(n) را خواهیم داشت که احتمال آن بسیار کم است . در حال که در بهترین حالت و حالت متوسط O(1) را خواهیم داشت!

آموزش زبان #C اول

در این درس با ارائه چند برنامه و مثال ساده به طرز کار زبان C

# می‌پردازیم. اهداف این درس عبارتند از :

 

لیست 1-1، یک برنامة ساده با عنوان Welcome در زبان C#

// Namespace اعلان

using  System;

 

// کلاس آغازین برنامه

class WelcomeCSS

  {

   // آغاز کار اجرای برنامه

   public static void Main()

    {

     // نوشتن متن در خروجی

     Console.WriteLine("Welcome to the C# Persian Tutorial!");

    }

  }

برنامة لیست 1-1 دارای 4 پارامتر اصلی است، اعلان Namespace، کلاس، متد Main() و یک دستور زبان C#.

در همین جا باید به یک نکته اشاره کنم، برای زبان C# همانند بیشتر زبانهای برنامه‌سازی دو نوع کامپایلر وجود دارد. یک نوع کامپایلر که به کامپایلر Command Line معروف است و نوع دیگر کامپایلر Visual است. کامپایلر‌های Command Line محیطی شبیه به محیط DOS دارند و با دادن یک سری دستورات به اجرا در می‌آیند. کامپایلرهای Visual محیطی همانند ویندوز دارند که با دارا بودن محیط گرافیکی و ابزارهای خاص، برنامه‌نویس را در امر برنامه‌سازی کمک می‌کنند. از نمونه‌های هر یک از کامپایلرها، می‌توان به Microsoft C# Command Line Compiler که یک کامپایلر Command Line و Microsoft Visual C# که یک کامپایلر Visual است، اشاره کرد. البته در حال حاضر بیشتر از کامپایلرهای ویژوال استفاده می‌شود.

من سعی می‌کنم در آینده به توضیح محیط Visual C# و Visual Studio.Net بپردازم. اما فعلاً برای اجرای برنامه‌ها می‌توانید از Visual Studio.Net استفاده کنید. پس از نصب آن، وارد محیط C# شده و در قسمت انتخاب برنامة جدید گزینة Console را جهت اجرای برنامه‌ها انتخاب نمایید.

برای این درس، فعلاً به توضیحات بیشتر دربارة محیط ویژوال نمی‌پردازم اما در آینده به توضیح کامل محیط Visual Studio.Net خواهم پرداخت.

برای اجرای کد بالا در صورتیکه از محیط ویژوال استفاده می‌کنید باید بر روی دکمة Run کلیک کنید و در صورتیکه کامپایلر Command Line دارید با دستور  زیر می‌توانید برنامه را اجرا کنید : csc Welcome.cs

پس از اجرای برنامه، کامپایلر برای شما یک فایل قابل اجرا(Executable) تحت نام Welcome.exe تولید می‌کند.

نکته : در صورتیکه از Visual Studio.Net(VS.Net) استفاده کنید، پس از اجرای برنامه، یک صفحه برای نمایش خروجی به سرعت باز شده و بسته می‌شود و شما قادر به دیدن خروخی نخواهید بود. برای اینکه بتوانید خروجی برنامه را ببینید، در انتهای برنامه دستور زیر را وارد نمایید :

Console.ReadLine();

 استفاده از این دستور باعث می‌شود تا برنامه منتظر دریافت یک ورودی از کاربر بماند، که در این حالت شما می‌توانید خروجی برنامه خود را دیده و سپس با زدن کلید Enter برنامه را خاتمه دهید.

 

نکتة دیگری که در مورد زبان برنامه‌نویسی C# باید مورد توجه قرار دهید اینست که این زبان Case Sensitive است، بدین معنا که به حروف کوچک و بزرگ حساس است یعنی برای مثال ReadLine با readLine متفاوت است به طوریکه اولی جزو دستورات زبان C# و دومی به عنوان یک نام برای متغیر یا یک تابع که از طرف کاربر تعریف شده است در نظر گرفته می‌شود.

 

اعلان Namespace به سیستم اعلان می‌نماید که شما از توابع کتابخانه‌ای  System  جهت اجرای برنامه‌ها خود استفاده می‌نمایید. دستوراتی مانند WriteLine و ReadLine جزو توابع کتابخانه‌ای System می‌باشند. اغلب دستورات و توابع مهم و کلیدی استفاده از کنسول ورودی/خروجی در این کتابخانه می‌باشد. در صورتیکه در ابتدای برنامه از using System استفاده نکنید، یابد در ابتدای هر یک از دستورات برنامه که مربوط این کتابخانه است، از کلمة System استفاده نمایید. بعنوان مثال در صورت عدم استفاده از using System باید از دستور System.Console.WriteLine() به جای Console.WriteLine() استفاده نمایید.

 

تعریف کلاس،Class Welcome CSS، شامل تعریف داده‌ها(متغیرها) و متدها جهت اجرای برنامه است. یک کلاس، جزو معدود عناصر زبان C# است که بوسیلة آن می‌توان به ایجاد یک شی (Object) از قبیل واسط‌ ها (Interfaces) و ساختارها(Structures)، پرداخت. توضیحات بیشتر در این زمینه در درس‌های آینده ذکر می‌شوند. در این برنامه کلاس هیچ داده‌ و متغیری ندارد و تنها شامل یک متد است. این متد، رفتار(Behavior) این کلاس را مشخص می‌کند.

 

متد درون این کلاس بیان می‌کند که این کلاس چه کاری را پس از اجرا شدن انجام خواهد داد. کلمة کلیدی Main() که نام متد این کلاس نیز می‌باشد جزو کلمات رزرو شده زبان C# است که مشخص می‌کند برنامه از کجا باید آغاز به کار نماید. وجود متد Main() در تمامی برنامه‌های اجرایی ضروری است. در صورتیکه یک برنامه حاوی متد Main() نباشد بعنوان توابع سیستمی همانند dll های ویندوز در نظر گرفته می‌شود.

قبل از کلمة Main() کلمه دیگری با عنوان static آورده شده است. این کلمه در اصطلاح Modifier می‌گویند. استفاده از static برای متد Main() بیان می‌دارد که این متد تنها در در همین کلاس قابل اجراست و هیچ نمونه‌ای (Instance) دیگری از روی آن قابل اجرا نمی‌باشد. استفاده از static برای متد Main() الزامی است زیرا در ابتدای آغاز برنامه هیچ نمونه‌ای از هیچ کلاس و شی‌ای موجود نمی‌باشد و تنها متد Main() است که اجرا می‌شود. (در صورتیکه با برخی اصطلاحات این متن از قبیل کلاس، شی، متد و نمونه آشنایی ندارید، این به دلیل آنست که این مفاهیم جزو مفاهیم اولیة برنامه‌نویسی شی‌گرا (OOP) هستند. سعی می‌کنم در درس‌های آینده به توضیح این مفاهیم نیز بپردازم، ولی فعلاً در همین حد کافی می‌باشد.)

 

هر متد باید دارای یک مقدار بازگشتی باشد، یعنی باید مقداری را به سیستم بازگرداند، در این مثال نوع بازگشتی void تعزیف شده است که نشان دهنده آنست که این متد هیچ مقداری را باز نمی‌گرداند یا به عبارت بهتر خروجی ندارد. همچنین هر متد می‌تواند دارای پارامترهایی نیز باشد که لیست پارامترهای آن در داخل پرانتزهای جلوی آن قرار می‌گیرد. برای سادگی کار در این برنامه متد ما دارای هیچ پارامتری نیست ولی در ادامة همین درس به معرفی پارامترها نیز می‌پردازم.

 

متد Main() رفتار و عمل خود را بوسیله Console.WriteLine(…) مشخص می‌نماید. Console کلاسی در System است و WriteLine() متدی در کلاس  Console. در زبان C# از اپراتور "." (نقطه dot) جهت جداسازی زیرروتین‌ها و زیرقسمتها استفاده می‌کنیم. همانطور که ملاحظه می‌کنید چون WriteLine() یک متد درون کلاس Console است به همین جهت از "." جهت جداسازی آن استفاده کرده‌ایم.

 

در زبان ‍C#، برای قرار دادن توضیحات در کد برنامه از // استفاده می‌کنیم. بدین معنا که کامپایلر در هنگام اجرای برنامه توجهی به این توضیحات نمی‌کند و این توضیحات تنها به منظور بالا بردن خوانایی متن و جهت و کمک به فهم بهتر برنامه قرار می‌گیرند. استفاده از // تنها در مواردی کاربرد دارد که توضیحات شما بیش از یک خط نباشد. در صورت تمایل برای استفاده از توضیحات چند خطی باید در ابتدای شروع توضیحات از /* و در انتها آن از */ استفاده نمایید. در این حالت تمامی مطالبی که بین /*  */ قرار می‌گیرند به عنوان توضیحات (Comments) در نظر گرفته می‌شوند.

 

تمامی دستورات (Statements) با ";"، سمی کولون، پایان می‌یابند. کلاس‌ها و متد‌ها با } آغاز شده و با { خاتمه می‌یابند. تمامی دستورات بین { } یک بلوک را می‌سازند.

 

بسیاری از برنامه‌ها از کاربر ورودی دریافت می‌کنند. انواع گوناگونی از این ورودی‌ها می‌توانند به عنوان پارامتری برای متد Main() در نظر گرفته شوند. لیست 2-1 برنامه‌ای را نشان می‌دهد نام کاربر را از ورودی دریافت کرده و آن را بر روی صفحه نمایش می‌دهد. این ورودی به صورت پارامتری برای متد Main() در نظر گرفته شده است.

 

لیست 2-1 : برنامه‌ای که ورودی را از کاربر، بعنوان پارامتر Main()، دریافت می‌کند.

// Namespace اعلان

using System;

// کلاس آغازین برنامه

class NamedWelcome

  {

   // آغاز اجرا برنامه

   public static void Main(string[] args)

     {

      // نمایش بر روی صفحه

      Console.WriteLine("Hello, {0}!", args[0]);

      Console.WriteLine("Welcome to the C# Persian Tutorial!");

     }

  }

توجه داشته باشید که این برنامه، ورودی را به صورت Command-Line دریافت می‌کند و در هنگام اجرای برنامه باید ورودی را در Command-Line وارد نمایید. در صورتیکه ورودی را وارد ننمایید برنامه دچار مشکل شده و متوقف خواهد شد.

 

همان طور که در لیست 2-1 مشاهده می‌نمایید، پارامتر متد Main() با عنوان args مشخص شده است. با استفاده از این نام در داخل متد می‌توان آن استفاده نمود. نوع این پارامتر از نوع آرایه‌ای از نوع رشته (string[]) در نظر گرفته شده است. انواع(types) و آرایه‌ها را در درس‌های بعدی بررسی می‌کنیم. فعلاً بدانید که آرایه رشته‌ای جهت نگهداری چندین کاراکتر مورد استفاده قرار می‌گیرد. [] مشخص کننده آرایه هستند که مانند یک لیست عمل می‌کند.

 

همانطور که ملاحظه می‌کنید در این برنامه دو دستور Console.WriteLine(…) وجود دارد که اولین دستور مقداری با دستور دوم متفاوت است. همانطور که مشاهده می‌کنید داخل دستور Console.WriteLine(…) عبارتی به شکل {0} وجود دارد. این آرگومان، نشان می‌دهد که به جای آن چه مقداری باید نمایش داده شود که در این جا args[0] نشان داده می‌شود. عبارتی که داخل " " قرار دارد عیناً در خروجی نمایش داده می‌شود، به جای آرگومان {0}، مقداری که پس از " قرار دارد، قرار می‌گیرد. حال به آرگومان بعدی یعنی args[0] توجه کنید. مقدار صفر داخل [] نشان می‌دهد که کدام عنصر از آرایه مورد استفاده است. در C# اندیس آرایه از صفر شروع می‌شود به همین جهت برای دسترسی به اولین عنصر آرایه باید از اندیس صفر استفاده کنیم.(همانطور که قبلاً نیز کفتم آرایه‌ها را در درس‌های آینده توضیح خواهم داد، هدف از این درس تنها آشنایی با C# است.!)

 

مجدداً به آرگومان {0} بازگردیم. این آرگومان نشان می دهد که یک مقدار باید در رشته خروجی قرار گیرد، این مقدار همان args[0]  است. اگر شما این برنامه را از طریق Command-Line اجرا نمایید خروجی شبیه به زیر خواهید گرفت :

>Hello!, Meysam!

>Welcome to C# Persian Tutorial!

همان گونه که می‌بینید، پس از اجرای برنامه نام شما که از طریق Command-Line آنرا وارد نموده‌اید در خروجی ظاهر می‌شود. استفاده از آرگومان {n}، که در آن n یک مقدار عددی است، جهت فرمت دادن به متن خروجی است که بر روی صفحه به نمایش در می‌آید. مقدار n از صفر آغاز شده و به ترتیب افزایش می‌باید. به مثال زیر توجه کنید :

Console.WriteLine("Hello! ,{0} ,{1}, {2}",args[0],args[1],args[2]);

این خط از برنامه سه مقدار args[0],args[1],args[2] را در خروجی به ترتیب نمایش می‌دهد. ملاحظه می‌نمایید که چون 3 مقدار را می‌خواهیم نمایش دهیم، سه بار از آرگومان {n} استفاده کرده‌ایم و هر بار یک واحد به مقدار قبلی افزوده‌ایم. در آینده بیشتر با این مفاهیم آشنا می‌شویم.

 

مطلبی که باید در مورد لیست 2-1 به آن توجه شود آنست که این برنامه تنها از طریق  Command-Lineقابل اجراست و در صورتیکه کاربر از این مطلب که برنامه باید دارای ورودی به صورت Command-Line باشد، بی اطلاع باشد و ورودی را در Command-Line وارد نکند، برنامه متوقف شده و اجرا نمی‌شود. پس برای رفع چنین مشکلی باید از روش بهتری جهت دریافت ورودی از کاربر استفاده کرد.

 

لیست 3-1 : یک برنامه که قابلیت محاوره با کاربر را دارد.

// Namespace اعلان

using System;

 

// کلاس آغازین برنامه

class InteractiveWelcome

  {

   //آغاز اجرای برنامه

   public static void Main()

    {

     // متنی بر روی صفحه نمایش داده می‌شود

     Console.Write("What is your name?: ");

     //متنی نمایش داده شده و برنامه منتظر دریافت ورودی می‌ماند

     Console.Write("Hello, {0}! ", Console.ReadLine());

     Console.WriteLine("Welcome to the C# Persian Tutorial!");

    }

  }

همانطوریکه در این برنامه دیده می شود، متد Main() دارای پارامتر نیست. در عوض یک خط به متن برنامه لیست 2-1 اضافه شده است. در اولین خط از این برنامه، متنی با عنوان اینکه نام شما چیست؟ بر روی صفحه ظاهر می‌شود. سپس در خط بعدی پس از نوشتن کلمه Hello, ، برنامه منتظر دریافت ورودی از کاربر می‌شود. بدین معنی که این بار تا زمانیکه کاربر متنی را به عنوان نام خود وارد نکند اجرای برنامه به پیش نخواهد رفت و خط بعدی اجرا نمی‌شود. این برنامه روش ایجاد ارتباط از طریق برنامه با کاربر را نمایش می‌دهد. در این مثال کاربر دقیقاً متوجه می‌شود که چه زمانی باید اطلاعات را وارد نماید و این اطلاعات چه باید باشد در حالیکه در مثال قبل چنین نبود. همانگونه که می‌بینید در این برنامه آرگومان {0} مستقیماً از طریق دستور Console.ReadLine() دریافت می‌شود و بلافاصله در خروجی نمایش داده می‌شود. دستور ReadLine() نیز یکی از متدهای کلاس Console است که بوسیله آن رشته ورودی خوانده می‌شود.

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

What is your name?:

(سپس برنامه منتظر دریافت متنی از ورودی توسط کاربر می‌ماند)

(پس از اینکه کاربر رشته‌ای را وارد کرد و کلیدEnter را فشار داد، متن زیر نمایش داده می‌شود.)

Hello, Meysam!

(سپس اجرای برنامه به دستور بعدی منتقل می‌شود)

Welcome to the C# Persian Tutorial!

 

خروجی کامل برنامه :

What is your name?:

Hello, Meysam! Welcome to the C# Persian Tutorial!

توجه کنید که ReadLine() به عنوان یک متد، مقداری را به سیستم بازمی‌گرداند. این مقدار در این برنامه به آرگومان {0} برگردانده می‌شود. این خط از برنامه را می‌توان طور دیگری هم نوشت :

string myName=Console.ReadLine();

Console.WriteLine("Hello, {0}!",myName);

 

در این حالت ما یک متغیر از نوع رشته با نام myName تعریف کرده‌ایم که مقدار ورودی در آن ذخیره می‌شود و سپس از این مقدار به عنوان مقداری‌ که {0} می‌پذیرد استفاده کرده‌ایم.

 

در این درس آموختید که ساختار کلی یک برنامه C# چگونه است. هر برنامه C# از یک کلاس اصلی تشکیل می‌شود که این کلاس شامل داده‌ها و متغیرها و متدهایی می‌باشد. متد آغازین برنامه که برنامه با آن شروع به اجرا می‌کند، متد Main() است. با استفاده از توابع کتابخانه‌ای می‌نوان به کلاسها و متدهای C# دسترسی پیدا کرد. از جمله این توابع System بود که یکی از کلاسهای آن Console و چند متد این کلاس،  متدهای WriteLine() و ReadLine() بودند.

در اینجا اولین درس به پایان رسید. از همه دوستانی که این مطلب را می‌خوانند تقاضا دارم نظرات و پیشنهادات خود را برای من mail کنند.

 

 

سیستم پیکربندی ASP.NET 2.0 (بخش سوم )

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

پیکربندی ترجمه
ASP.NET ، صفحات وب ، سرویس های وب ، http handlers ، فایل های برنامه ( نظیر Global.asax ) و فایل های منبع  را به صورت پویا ترجمه می نماید . فایل های فوق به صورت پویا و همزمان با اولین درخواست ، ترجمه می گردند .
هر نوع تغییر در فایل ترجمه شده پویا باعث می گردد  که تمامی منابع متاثر از تغییرات شوند و به صورت پویا invalidated و مجددا" ترجمه گردند . مکانیزم فوق پیاده کنندگان را قادر می سازد که به سرعت برنامه های وب را با حداقل overhead اجراء نمایند. چراکه پس از تشخیص تغییرات و ترجمه پویا ، می توان بلافاصله از امکانات برنامه ها استفاده نمود . 
پتانسیل ترجمه پویا در ASP.NET 2.0 نسبت به ASP.NET 1.x افزایش و فایل های دیگری نظیر کلاس فایل ها را نیز تحت پوشش قرار می دهد .
برای پیکربندی تنظیمات ترجمه از بخش <compilation> در فایل های web.config و یا machine.config استفاده می گردد . ASP.NET engine ، در زمان مورد نیاز صفحه را ترجمه و کد تولید شده را در code cache ذخیره می نماید .از cache فوق در زمان اجرای صفحات ASP.NET استفاده می گردد .
کد زیر گرامر بخش <compilatioin>  را نشان می دهد .

<!-- compilation Attributes -->
<compilation
     tempDirectory="directory"
     debug="[true|false]"
     strict="[true|false]"
     explicit="[true|false]"
     batch="[true|false]"
     batchTimeout="timeout in seconds"
     maxBatchSize="max number of pages per batched compilation"
     maxBatchGeneratedFileSize="max combined size in KB"
     numRecompilesBeforeAppRestart="max number of recompilations ?
      defaultLanguage="name of a language as specified in a <compiler/> element below"
      <compilers>
          <compiler language="language"
              extension="ext"
              type=".NET Type"
              warningLevel="number"
              compilerOptions="options"/>
     </compilers>
     <assemblies>
            <add assembly="assembly"/>
     </assemblies>
     <codeSubDirectories>
            <codeSubDirectory directoryName="sub-directory name"/>
     </codeSubDirectories>
     <buildproviders>
            <buildprovider
                extension="file extension"
                type="type reference"/>
     </buildproviders>
</compilation>

توضیحات :

  • batch : نوع ترجمه را مشخص می نماید (مقدار پیش فرض True است ) .

  • maxBatchSize : حداکثر تعداد صفحات و یا کلاس را که می توان در یک batch ترجمه نمود، مشخص می نماید. ( مقدار پیش فرض 1000 )

  • maxBatchGeneratedFileSize : حداکثر اندازه خروجی یک batch assembley ترجمه شده را نشان می دهد ( مقدار پیش فرض 3000  )

  • batchTimeout : زمان ( بر حسب ثانیه ) ترجمه batch را مشخص می نماید . در صورتی که زمان فوق قبل از اتمام ترجمه به پایان رسیده باشد ، یک exception محقق می گردد ( مقدار پیش فرض پانزده ثانیه است) .

  • debug : آیا می بایست اسمبلی های تولید شده را ترجمه ویا دیباگ نمود ؟ (مقدار پیش فرض False  ).

  • defaultLanguage : زبان برنامه نویسی پیش فرض نظیر VB و یا #C برای استفاده در فایل های ترجمه پویا را مشخص می نماید.

  • tempDirectory : دایرکتوری مورد نظر برای استفاده موقت در حین ترجمه را مشخص می نماید . به صورت پیش فرض ، ASP.NET فایل موقت را در مسیر
     [WinNTWindows]Microsoft.NETFramework[version]Temporary ASP.NET ایجاد می نماید .

  • compilers : بخش <compilers> ، می تواند شامل چندین زیر عنصر <compile> باشد که از آنان به منظور ایجاد یک تعریف جدید کمپایل استفاده می گردد .

  • numRecompilesBeforeAppRestart : تعداد دفعات ترجمه ، قبل از راه اندازی برنامه مشخص می نماید .

قابلیت های مرورگر
شناسائی و استفاده از پتانسیل مرورگرها برای برنامه های وب ضروری است . browser capabilities component  بگونه ای طراحی شده است  تا بتواند از مرورگرهای مختلفی نظیر  opera , netscape و IE  حمایت نماید .  با استفاده از <browserCaps> می توان تنظیمات پیکربندی را برای browser capabilities component  مشخص نمود . از عنصر فوق می توان در سطوح متفاوتی ‌نظیر ماشین ، سایت ، برنامه و زیر دایرکتوری ها استفاده نمود .
پس از دریافت یک درخواست از یک مرورگر ، browser capabilities component  قابلیت های مرورگر را از طریق هدر درخواست شناسائی و برای هر نوع مرورگر یک مجموعه از تنطیمات مرتبط با برنامه را ترجمه می نماید . تنظیمات فوق را می توان به صورت ایستا انجام و یا از هدر درخواست ارسالی استفاده نمود  . یک برنامه می تواند در صورت ضرورت تنظیمات فوق را را توسعه و یا تغییر دهد .
در ASP.NET 2.0 تمامی اطلاعات مربوط به قابلیت های مرورگر در  "فایل های تعریف مرورگر"  ارائه می گردند . این نوع فایل ها ، فایل هائی با انشعاب browser.*  و فرمت xml می باشند . یک فایل ممکن است شامل تعریف بیش از یک نوع مرورگر باشد . فایل های فوق در زمان نصب فریمورک در آدرس
[WinNTWindows]Microsoft.NETFrameworkxxxxxCONFIGBrowsers نصب می گردند . ( در ASP.NET 1.x ، اطلاعات مربوط به پتانسیل هر مرورگر در فایل های machine.config و web.config ذخیره می گردد ).

    توصیف ویژگی های هر مرورگر


هر مرورگر به عنوان یک موجودیت و با استفاده از عنصر <browser> تعریف و دارای یک id مختص به خود  است که یک کلاس از مرورگر را به همراه کلاس parent مشخص می نماید . <browsers> ، عنصر ریشه در فایل های تعریف مرورگر است و  از خصلت id به منظور تمایز بین تعاریف هر یک از مرورگر ها ( در صورتی که بیش از یک مورد در یک فایل تعریف شده باشد ) ، استفاده می گردد .  
قبل از اجرای یک برنامه ASP.NET ، فریمورک تمامی تعاریف مرورگر را در یک اسمبلی ترجمه و آنان را در GAC ذخیره می نماید .
در صورت تغییر فایل های تعریف مرورگر در سطح سیستم ، تغییرات به صورت اتوماتیک بر روی هر یک از برنامه های ASP.NET اعمال نخواهد شد . بنابراین ، این مسئولیت پیاده کنندگان و یا ابزارهای نصب است که اطلاعات فوق را بهنگام نمایند . اطلاعات بهنگام شده مرورگر را می توان با استفاده از برنامه aspnet_regbrowsers.exe برای تمامی برنامه های ASP.NET ارسال نمود . پس از اجرای برنامه فوق ، اطلاعات مرورگر مجددا" ترجمه و اسمبلی جدید در GAC  ذخیره می گردد . از اسمبلی فوق تمامی برنامه های ASP.NET استفاده می نمایند .

 خطاهای سفارشی
در صورت بروز اشکال در هر یک از صفحات ASP.NET ، یک صفحه خطاء نمایش داده می شود که در آن کد نوشته شده به همراه مکان ( شماره خط ) بروز خطاء نشان داده می شود . نمایش کد منبع و مکان بروز خطاء در یک صفحه چالش های مختص به خود را دارد :

  • نمایش کد منبع و پیام خطاء  برای کاربران عادی هیچگونه ارزش اطلاعاتی ندارد، پس چرا می بایست آنان را نمایش داد ؟  

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

ASP.NET با ارائه یک زیرساخت مناسب امکان پیشگیری از نمایش اینگونه خطاها را در اختیار پیاده کنندگان برنامه های وب قرار می دهد . بدین منظور از بخش <customeErrors>  در فایل web.config برای تعریف پیام های خطاء سفارشی و سیاست نمایش جزئیات خطاء استفاده می گردد . نحوه استفاده از عنصر فوق به صورت زیر است :

<customErrors defaultRedirect="[url]" mode="[on/off/remote]">
         <error statusCode="[statuscode]" redirect="[url]" />
</customErrors>rs>

توضیحات :

  • defaultRedirect : آدرس صفحه ای را که پس از بروز خطاء مرورگر کاربران به آن هدایت می گردند را مشخص می نماید .  

  • mode : مقدار نسبت داده شده به این خصلت وضعیت نمایش خطاء سفارشی را مشخص می نماید . در صورتی که مقدار این خصلت on باشد ، خطاهای سفارشی نمایش داده می شوند . در صورتی که مقدار mode معادل off باشد ، خطاهای سفارشی نمایش داده نخواهند شد و در صورتی که مقدار این خصلت remote در نظر گرفته شود ، خطاهای سفارشی صرفا" برای کاربران از راه دور نمایش داده می شود .

  • customeErrors : این بخش شامل چندین زیرعنصر <error> است که از  آنان به منظور تعریف خطاهای سفارشی استفاده می گردد . هر زیر عنصر <error>  می تواند شامل یک خصلت statusCode و یک URL باشد . 

 <configuration>
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="/DefaultErrorPage.htm">
      
 <error statusCode="500" redirect="/error/ServerError.htm"/>
          <error
statusCode="404" redirect="/error/Filenotfound.aspx"/>
          <error
statusCode="403" redirect="/error/Forbidden.aspx"/>

   </customErrors>
  </system.web>
</configuration>

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

سیستم پیکربندی ASP.NET 2.0 (بخش دوم )

در بخش اول با اصول اولیه سیستم پیکربندی ASP.NET 2.0 آشنا شدیم . در این بخش به بررسی برخی از تنظمیات پیکربندی خواهیم پرداخت .

‍‍‍Connection String
در ASP.NET 1.x ، اطلاعات مربوط به connection string در بخش <appSetting> ذخیره می گردید . در ASP.NET 2.0 ، تمامی اطلاعات در ارتباط با connection-string در یک  بخش جدید با نام <connectionStrings> ذخیره می گردد .
ذخیره اطلاعات connection - string در بخش <appSetting>  دارای چالش های مختص به خود است :
  • زمانی که اطلاعات connection string در بخش appSetting  ذخیره می گردد ، برای یک کنترل مرتبط با داده نظیر SqlCacheDependency و یا MembershipProvider  امکان دستیابی به اطلاعات وجود ندارد . 

  • ایمن سازی Connection string با استفاده از الگوریتم های رمزنگاری چالش های خاص خود را دارد .

  • ویژگی فوق صرفا" در ارتباط با برنامه های ASP.NET نبوده و  تمامی برنامه های دات نت نظیر Windows Forms , Web Service و سایر موارد دیگر را نیز شامل می شود .

با توجه به این که اطلاعات connection string مستقل از بخش appSetting ذخیره می گردد ، می توان آنان را با استفاده از مجموعه متد ConnectionString بازیابی نمود .
کد زیر نحوه ذخیره  connection string در فایل Web.config  را نشان می دهد .

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <connectionStrings>
      <add
           name="MyConnectionString1"
           connectionString="Data Source providerName="System.Data.SqlClient" />
   </connectionStrings>
</configuration>

نحوه بازیابی اطلاعات یک connection string در برنامه :

Public Sub Page_Load (sender As Object, e As EventArgs)
...
Dim dbConnection as New _
   SqlConnection(ConfigurationSettings.ConnectionStrings(
"MyConnectionString1"))
...
End Sub

پیکربندی Session State
state management یکی از مسائل مهم در زمان پیاده سازی برنامه های وب است که می بایست با توجه به اهمیت آن به درستی با ابعاد آن آشنا گردید . در گذشته ای نه چندان دور ( ده سال پیش ) ، با این که برای پیاده سازی برنامه های کامپیوتری از معماری client-server  استفاده می گردید ولی عملا"  در معماری فوق ما دارای یک fat client و یک  fat server می باشیم که برای ذخیره state از امکانات موجود در سمت سرویس دهنده و یا سرویس گیرنده استفاده می شود . با توجه به این که در  معماری فوق ، یک ارتباط دائم بین سرویس گیرندگان و سرویس دهنده وجود دارد برای ذخیره و نگهداری state با مشکل خاصی مواجه نمی شویم .
در برنامه های وب گفتگوی بین یک سرویس گیرنده و یک سرویس دهنده از طریق پروتکل HTTP انجام می شود و جملگی به خوبی می دانیم که این پروتکل یک پروتکل stateless است و ارتباط با یک سرویس دهنده از راه دور در زمان مورد نیاز ایجاد و در ادامه و پس از سرویس دهی ، غیرفعال می شود . با این که HTTP 1.1 از یک روش Keep-alive استفاده می نماید ولی سرویس دهنده نمی تواند درخواست های ایجاد شده توسط یک سرویس گیرنده را تشخیص دهد . 
برای ذخیره و نگهداری state  از گزینه های متعددی استفاده می گردد که session یک نمونه در این زمینه است .شی Session متداولترین محلی است که می توان اطلاعات مربوط به وضعیت برنامه  و کاربران را  در آن ذخیره و نگهداری نمود . برای پیاده سازی session از یک Hashtable استفاده می گردد و  داده بر اساس ترکیب زوج  کلید و مقدار ذخیره می شود .
Session در ASP.NET 2.0 یک مفهوم جدید نیست و متاثر از ماهیت پروتکل HTTP  است ( Stateless ) و قبل از ASP.NET و حتی ASP کلاسیک وجود داشته است .

داده Session در چه مکانی ذخیره می گردد ؟
شی Session یک روش موثر برای ذخیره و نگهداری وضعیت یک برنامه و یا کاربران آن را ارائه می نماید. ASP.NET به همراه سه Storage Provider ارائه شده است :

  • In-Process Session State Store : اطلاعات session در Cache ( حافظه ) ذخیره می گردد .

  • Out-of-Process Session State Store : اطلاعات Session در State Server Service ذخیره می گردد ( asp_net_state.exe )

  • Sql Session State Store : اطلاعات session در بانک اطلاعاتی SQL ذخیره می گردد . برای پیکربندی از aspnet_regsql.exe استفاده می گردد .

در  ASP.NET 2.0 ، یک قابلیت جدید با نام custome به مجموعه فوق اضافه شده است . با استفاده از گزینه فوق ، پیاده کنندگان می توانند داده session را در یک مکان دائم ذخیره نمایند . مثلا" ASP.NET 2.0 امکان ذخیره داده session را در  برخی بانک های اطلاعاتی  نظیر Oracle,DB2 و یا Sybase ندارد . در صورتی که بخواهیم داده session را در یکی از  بانک های اطلاعاتی فوق و یا یک فایل XML ذخیره نمائیم ، می توان از یک Provider class سفارشی استفاده نمود .
برای پیکربندی اطلاعات session از عنصر <sessiononState > در فایل web.config  استفاده می گردد :

<configuration>
   <system.web>
     <sessionState mode="Off|InProc|StateServer|SQLServer|Custom" ../>
   </system.web>
...
</configuration>

 
در ادامه به بررسی مختصر هر یک از گزینه های فوق خواهیم پرداخت .

In-Process Session State Store  : متداولترین و در عین حال سریعترین روش پیکربندی session state در ASP.NET 2.0 می باشد ( مقدار mode برابر inproc در نظر گرفته می شود )  .در این روش داده Session  در cache داخلی HttpRuntime ذخیره شده و به صورت live قابل دستیابی است . با توجه به این که داده session در حافطه ذخیره می گردد ، به سرعت می توان به آن دستیابی داشت ( ضرورتی ندارد  داده از یک مکان دیگر به درون حافظه انتقال یابد ).  داده seesion تا زمان اعتبار session در حافظه موجود می باشد و پس از time out فضای اشغال شده آزاد می گردد . 

Out-of-Process Session State Store : داده  session  در یک process که به عنوان یک سرویس ویندوز اجراء می گردد ، نگهداری می شود ( aspnet_state.exe ) .
 State Service به صورت پیش فرض اجراء نمی گردد و برای فعال کردن آن می توان از دستور net start aspnet_sate استفاده نمود . به صورت پیش فرض ، سرویس فوق از پورت 42424 استفاده می نماید . در صورت ضرورت می توان با استفاده از کلید ریجستری زیر آن را تغییر داد .

HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParametersPort

برای استفاده از روش فوق کافی است که مقدار Inproc به StateServer در فایل web.config تغییر داد . همچنین می بایست از خصلت StateConnectionString به منظور مشخص نمودن IP و شماره پورتی که Session State Service بر روی آن اجراء شده است ، استفاده نمود .

<configuration>
  <system.web>
     <sessionState mode="StateServer"
 
         stateConnectionString="tcpip=127.0.0.1:42424"/>
  </system.web>
</configuration>

Sql Session State Store : داده session در یک بانک اطلاعاتی SQL ذخیره می گردد .

<configuration>
  <system.web>
    <sessionState
        mode="SQLServer"
        sqlConnectionString="data source= TestSessionServer;
        user id=TestWebUser;password=Test"
        cookieless="false"
        timeout="20"
     />
 </system.web>
</configuration>.

Custom State Store :معماری Sessin state در ASP.NET 2.0 بگونه ای طراحی شده است که امکان افزودن Provider به آن وجود دارد ( مشتق شده از کلاس SessionStateStoreProviderBase  ) . در صورتی که بخواهیم Provider اختصاصی خود را ایجاد و یا از یک  third-party provider استفاده نمائیم ، می بایست مقدار خصلت mode را Custome در نظر گرفت . در چنین مواردی ، لازم است که custom provider assembly مشتق شده از کلاس SessionStateStoreProviderBase را مشخص نمود .

<configuration>
  <system.web>
    <sessionState
        mode="Custom"
          CustomProvider="CustomStateProvider">
          <providers>
             <add name="CustomStateProvider"
                type="CustomStateProviderAssembly,
                CustomStateProviderNamespace.CustomStateProviderSateProvider"/>
           </providers>
   </sesisonState>
 </system.web>
</configuration>

 مثال : کد زیر یک نمونه از پیکربندی sessionState  در فایل web.config را نشان می دهد :

<sessionState
      mode="StateServer"
      cookieless="false"
      timeout="20"
      stateConnectionString="tcpip=TestSessionStore:42424"
     
stateNetworkTimeout="60"
      sqlConnectionString=""
/>

توضیحات :

  • mode : نوع ذخیره سازی اطلاعات session را مشخص می نماید . در این رابطه از پنج گزینه Off, InProc, StateServer, SQLServer  و Custom استفاده می گردد . که مقدار پیش فرض InProc است .  

  •  cookieless : مشخص می نماید که آیا از HTTP cookieless Session Key management حمایت می گردد .

  • timeout : مدت زمان حیات Session را مشخص می نماید  . مقدار timeoute بر اساس زمان درخواست ارزیابی می گردد . مثلا" در صورتی که مقدار timeout بیست دقیقه باشد و در خواستی در ساعت ده و ده دقیقه دریافت گردد ، timeout در ساعت ده و سی دقیقه به اتمام می رسد .

  • stateConnnectionString :از خصلت  فوق به منظور مشخص نمودن آدرس  TCP/IP و پورت جهت ارتباط یا  Windows Service providing state management استفاده می گردد ( در مواردی که mode=StateServer در نظر گرفته شود ) .

  • stateNetworkTimeout : مقدار timeout ( بر حسب ثانیه ) را  در زمان ذخیره state در یک out-of-process session ( نظیر  StateServer ) ، مشخص می نماید . 

  • sqlConnectionString : از خصلت فوق  جهت ارتباط با بانک اطلاعاتی SQL Server  برای ذخیره و بازیابی داده session استفاده می گردد ( در مواردی که mode=SQLServer در نظر گرفته شود) . 

پیکربندی Session State  با استفاده از Connection string  : کد زیر یک نمونه از پیکربندی Session State با استفاده از connection string را نشان می دهد :

<configuration>
 <connectionStrings>
   <add name = "TestSessionState"
      connectionString = "data source=TestSessionServer;
      user id=TestWebUser;password=test" />
 </connectionStrings>
 <system.web>
   <sessionState
     mode="SQLServer"
     sqlConnectionString="TestSessionState"
     cookieless="false"
     timeout="20"
    />
 </system.web>
</configuration>

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

سیستم پیکربندی ASP.NET 2.0 (بخش اول)

پیاده کنندگان برنامه های وب که از  فن آوری ASP کلاسیک به منظور پیاده سازی برنامه های وب در گذشته ای نه چندان دور استفاده می کردند ( و شاید هم اینک نیز استفاده می نمایند ) ، به یاد دارند که اطلاعات پیکربندی برنامه های فوق به صورت باینری و در محلی با نام متابیس IIS ، ذخیره می گردد . پیاده کنندگان برنامه های وب برای اعمال تغییرات لازم در متابیس از دو گزینه متداول استفاده می کردند : نوشتن اسکریپت های مورد نیاز و یا استفاده از کنسول مدیریتی برنامه IIS ( سرویس دهنده وب مایکروسافت ) .
برخلاف ASP کلاسیک ، در ASP.NET 1.x حضور متابیس ها کم رنگ گردید و در مقابل ، استفاده از یک سیستم پیکربندی مبتنی بر xml مورد توجه قرار گرفت . علیرغم این که سیستم فوق دارای انعطاف بمراتب بیشتری نسبت به نسخه قبلی است ولی امکانات مدیریتی مناسبی را به منظور ویرایش فایل های پیکربندی در اختیار پیاده کنندگان برنامه های وب قرار نمی دهد . تنها گزینه موجود برای ویرایش یک فایل پیکربندی ، برخورد با فایل پیکربندی به عنوان یک فایل xml و بهنگام سازی آن فایل بر اساس ماهیت فایل های xml است .  مهمترین مشکل رویکرد فوق ، برخورد با تمامی بخش های فایل پیکربندی به عنوان گره های xml است .
در ASP.NET 2.0 ، امکانات و پتانسیل های متعددی به منظور مدیریت پیکربندی برنامه های وب ارائه شده است با این هدف که بتوان با سادگی و سرعت بیشتری پیکربندی یک برنامه وب را انجام داد .خواندن و ویرایش فایل های پیکربندی در یک ماشین محلی و یا از راه دور از جمله مهمترین ویژگی های ارائه شده در ASP.NET 2.0 می باشد .
اطلاعات پیکربندی یک برنامه ASP.NET  در دو فایل مهم Xml ذخیره می گردد . از Xml برای تشریح خصلت ها و رفتار جنبه های مختلف برنامه های ASP.NET استفاده می‌شود . سیستم  پیکربندی ASP.NET از دو فایل پیکربندی استفاده می نماید :
  • machine.config : فایل پیکربندی سرویس دهنده 

  • Web.Config : فایل پیکربندی برنامه

با توجه به ماهیت فایل های پیکربندی ( فایل هائی از نوع  xml ) ، عناصری که مسئولیت تشریح پیکربندی را برعهده دارند نسبت به حروف بزرگ و کوچک حساس می باشند .
در مثال زیر ، یک نمونه فایل  web.config  به همراه بخش مربوط به معرفی <sessionState> یک برنامه وب  نشان داده شده است .

<?xml version="1.0" encoding="UTF-8" ?>
 <configuration>
   <system.web>
       <sessionState
           mode="InProc"
           stateConnectionString="tcpip=127.0.0.1:42424"
           stateNetworkTimeout="10"
           sqlConnectionString="data source=127.0.0.1; user id=sa; password=test"
           cookieless="false"
           timeout="20"
       />
    </system.web>
</configuration>

مزایای استفاده از یک فایل xml برای پیکربندی (در مقابل یک متابیس باینری )

  • امکان خواندن اطلاعات پیکربندی وجود داشته و می توان به سادگی و با استفاده از یک ویرایشگر متن نظیر NotePad آنان را ویرایش نمود  ( گرچه توصیه می گردد که در این رابطه از ویژوال استودیو 2005 و یا ادیتوری  که قادر به تشخیص تگ های xml می باشد ، استفاده گردد). فایل پیکربندی را می توان به سادگی از یک سرویس دهنده به سرویس دهنده دیگر منتقل نمود . ویژگی فوق در یک Web Farm بسیار مفید و موثر می باشد .

  • پس از انجام تغییرات مورد نیاز  در یک فایل پیکربندی ، ASP.NET به صورت اتوماتیک تغییرات ایجاد شده را تشخیص و آنان را در ارتباط با برنامه اعمال خواهد کرد . ASP.NET بدین منظور یک نمونه جدید از برنامه را ایجاد و کاربران را به برنامه جدید هدایت می نماید .

  • پس از اعمال تغییرات در پیکربندی یک برنامه ASP.NET ، ضرورتی ندارد که مدیریت برنامه سرویس دهنده وب را متوقف و مجددا" فعالیت آن را آغاز نماید . 

  • سیستم پیکربندی ASP.NET قابل توسعه است و اطلاعات مرتبط با یک برنامه را می توان به سادگی ذخیره و بازیابی نمود .

  • اطلاعات حساس ذخیره شده در سیستم پیکربندی ASP.NET 2.0 را می توان در صورت تمایل به صورت رمزشده ذخیره نمود ( اقدامی در جهت افزایش امنیت و ایمن سازی برنامه های وب خصوصا" اطلاعات حساس مرتبط با آنان ) .

فایل پیکربندی سرویس دهنده  : machine.config
هر سرویس دهنده ASP.NET دارای یک فایل پیکربندی با نام machine.config است که در زمان نصب فریمورک بر روی سیستم ایجاد می گردد . فایل فوق در مسیر C:WindowsMicrosoft.NETFrameworkv2.0xxxxx نصب و از محتویات آن به عنوان تنظیمات پیش فرض در تمامی برنامه های ASP.NET نصب شده بر روی سرویس دهنده استفاده می گردد . با توجه به نقش مهم این فایل در عملکرد تمامی برنامه های موجود بر روی کامپیوتر ( ویندور ، وب ) لازم است که تغییر در فایل فوق با دقت خاصی انجام شود و نسبت به نوع کار و دامنه متاثر از تغییرات شناخت کافی وجود داشته باشد .
در صورتی که بر روی سیستم چندین نسخه از فریمورک دات نت نصب شده باشد ، هر نسخه دارای فایل پیکربندی machine.config مختص به خود است  . مثلا" در صورتی که بر روی کامپیوتر نسخه های ASP.NET 1.1 ، ASP.NET 1.0 و ASP.NET 2.0  نصب شده باشد ، هر نسخه فریمورک دارای فایل machine.config مختص به خود است . این بدان معنی است که بر روی سرویس دهنده فوق سه فایل پیکربندی machine.config  وجود خواهد داشت .
علاوه بر فایل machine.config ، فریمورک دات نت دو فایل دیگر را به اسامی machine.config.default  و  machine.config.comments نیز نصب می نماید . از فایل اول به عنوان نسخه backup فایل machine.config استفاده می گردد. در صورتی که بخواهیم به تنظیمات اولیه برگردیم ، کافی است تنظیمات موجود در فایل machine.config.default را به فایل machine.config کپی نمود . در فایل دوم ( machine.config.Comments ) ، هر بخش از فایل پیکربندی تشریح  می گردد .
 ASP.NET runtime ، از دو فایل فوق استفاده نمی نماید و صرفا" بدین جهت نصب شده اند تا در صورت ضرورت از آنان به منظور برگشت به حالت اولیه استفاده نمود ( default factory setting ) .

فایل پیکربندی برنامه  : web.config
برخلاف فایل machine.config ، هر برنامه ASP.NET دارای نسخه اختصاصی تنظیمات پیکربندی مختص به خود است که در فایلی با نام web.config ذخیره می گردد . در صورتی که برنامه وب دارای چندین Subfolder باشد ، هر subfolder دارای فایل web.config مختص به خود است  که محتویات آن از تنظیمات موجود در فایل پیکربندی parent به ارث رسیده است و یا تنظیمات مورد نظر را خود تعریف می نماید . 
برای بهنگام سازی سرویس دهندگان در farm ( بر اساس تنظمیات جدید ) ، می توان به سادگی فایل web.config را به دایرکتوری مربوط به برنامه کپی نمود . در چنین مواردی ضرورتی به دستیابی سرویس دهنده محلی و راه اندازی آن وجود نداشته و برنامه ادامه فعالیت خود را به صورت طبیعی و بر اساس تنظیمات جدید انجام خواهد داد .

 نحوه بکارگیری پیکربندی
زمانی که ASP.NET runtime ، تنظمیات پیکربندی را برای یک درخواست وب بکار می گیرد ، فایل machine.config در یک مجموعه ترکیب و اطلاعات فوق در ارتباط با برنامه مورد نظر بکار گرفته می شوند . تنظیمات پیکربندی از برنامه وب parent به ارث برده می شود . فایل machine.config به عنوان parent تمامی برنامه های وب در نظر گرفته می شود .
پیکربندی هر برنامه وب منحصربفرد است گرچه این تنظیمات از parent به ارث رسیده باشند . مثلا" در صورتی که فایل web.config موجود در فهرست ریشه یک وب سایت مقدار session timeout  را معادل ده دقیقه تعریف نماید ، تنظمیات پیش فرض در فایل machine.config که مقدار session timeout را بیست دقیقه تعریف کرده است ، نادیده می گیرد . 

تشخیص تغییر در فایل پیکربندی
ASP.NET به صورت اتوماتیک تغییرات ایجاد شده در فایل های machine.config و web.config را تشخیص می دهد . تشخیص فوق توسط  رویداد file-change که توسط سیستم عامل محقق می گردد ، انجام می شود .
زمانی که یک برنامه ASP.NET فعالیت خود را آغاز می نماید ، تنظیمات پیکربندی خوانده شده و  در ASP.NET Cache ذخیره می شوند .در ادامه یک file dependency در entry مربوط به cache در فایل machine.config و یا web.config قرار می گیرد . پس از تشخیص تغییر در فایل های machine.config و یا web.config ، یک application domain جدید توسط ASP.NET ایجاد تا به درخواست های جدید سرویس دهد . application domain قدیم پس از پاسخگوئی به درخواست های جاری از بین خواهد رفت .

فرمت فایل پیکربندی
شاید تنها تفاوت اصلی فایل های web.config و machine.config ، نام آنان باشد و شکل و ساختار دو فایل فوق مشابه است . فایل های پیکربندی به چندین بخش تقسیم و هر بخش توسط یک xml element سطح بالا مشخص می گردد . عنصر ریشه xml یک فایل پیکربندی ،  <configuration>  نامیده می شود .
در مثال زیر ، یک فایل نمونه web.config نشان داده شده است ( مقادیر بین علائم [] ، در یک فایل پیکربندی واقعی ، با مقادیر واقعی جایگزین می گردند )  .

<?xml version="1.0" encoding="UTF-8"?>
  <configuration>
       <configSections>
            <section name="[sectionSettings]" type="[Class]"/>
            <sectionGroup name="[sectionGroup]">
                  <section name="[sectionSettings]" type="[Class]"/>
             </sectionGroup>
       </configSections>
   </configuration>

عنصر ریشه Xml یک فایل پیکربندی همواره <configuration>  نامیده می شود . هر section handler به همراه تنظمیات مربوطه در یک <SectionGroup> قرار می گیرند . <SectionGroup> یک ساختار سازمانی درون فایل پیکربندی را ارائه  می نماید تا به کمک آن بتوان پیکربندی مورد نیاز را در گروه های منحصربفرد انجام داد  . به عنوان نمونه بخش <system.web> درون فایل پیکربندی ، مکانی را  که اطلاعات آن در ارتباط با  ASP.NET می باشد ، مشخص می نماید.
پس از آشنائی اولیه با اصول سیستم پیکربندی ASP.NET 2.0 در بخش بعدی با برخی از تنظمیات پیکربندی آشنا خواهیم شد .

برنامه های وب مبتنی بر سرویس گیرنده : AJAX و Atlas

یکی از ویژگی های مهم برنامه های وب ، تبعیت آنان از معماری "سرویس گیرنده - سرویس دهنده"  است . این بدان معنی است که پیاده کنندگان برنامه های وب می توانند به منظور تحقق پردازش های سمت سرویس دهنده و سرویس گیرنده از فن آوری های متعددی استفاده نمایند. یکی از نکات مهم در خصوص انجام پردازش های سمت سرویس گیرنده ، میزان وابستگی آنان به اطلاعات موجود در سمت سرویس دهنده است . به عبارت دیگر ، اجرای یک event handler در سرویس گیرنده تا چه میزان وابسته به کد سمت سرویس دهنده است و  به منظور انجام آن چه میزان داده می بایست بین سرویس گیرنده و سرویس دهنده مبادله گردد ؟
صرفنظر از این که  به سوال فوق چه پاسخی داده می شود ، واقعیت این است که به منظور مدیریت رویدادهای محقق شده در سمت سرویس گیرنده ، می بایست ملزومات مورد نیاز ایجاد تا پیاده کنندگان بتوانند با استفاده از آنان پردازش های سمت سرویس گیرنده را مدیریت نمایند .

پردازش های سمت سرویس گیرنده از گذشته تاکنون
با توجه به این که پردازش های سمت سرویس گیرنده در برنامه های وب می بایست مستقل از نوع پلت فرم باشند ،  بدیهی است که تمامی تلاش های انجام شده در این عرصه ، می بایست متمرکز بر روی برنامه های مرورگر باشد تا با ایجاد پتانسیل هائی در آنها ، امکان انجام پردازش های سمت سرویس گیرنده فراهم گردد . ظهور زبان های اسکریپت نویسی نظیر جاوااسکریپت و  تجهیز مرورگرها به برنامه های مفسر مربوطه از جمله اقدامات عملی دراین عرصه است . استفاده از زبان جاوااسکریپت به منظور کدینگ پردازش های سمت سرویس گیرنده دارای قدمتی چندین ساله است . در ادامه ، قابلیت های جدیدی به مرورگرها اضافه گردید تا پیاده کنندگان بتوانند به کمک آنان برنامه های وب سمت سرویس گیرنده را ایجاد نمایند . هم اینک ، تمامی مرورگرهای متداول از یک مدل شی گراء موسوم  به DOM ( برگرفته از document object model ) استفاده می نمایند و تعداد اندکی از آنها از یک ویژگی جدید با نام XMLHTTP استفاده می نمایند  که به کمک آن ،  سرویس گیرندگان و سرویس دهندگان می توانند بدون نیاز به انجام یک postback کامل و round trip با یکدیگر و به صورت مستقیم ارتباط برقرار نمایند.
XMLHTTP  ، شامل مجموعه ای API ( رابط برنامه نویسی ) است که امکان ارسال و یا دریافت داده به صورت باینری ، HTML و XML را از سرویس دهندگان وب بر روی اینترنت و به کمک پروتکل HTTP فراهم می نماید .  در مواردی که نیاز به داده موجود در سمت سرویس دهنده می باشد ،  XMLHTTP  به صورت پیوسته اقدام به ارسال درخواست خود برای سرویس دهنده می نماید تا آخرین اطلاعات را بدون نیاز به refresh کردن مدام مرورگرها ، بازیابی نماید . در واقع ، به کمک فن آوری فوق ، سرویس گیرندگان قادر به مبادله غیرهمزمان با سرویس دهنده بوده و می توانند اقدام به ارسال و یا دریافت داده XML بدون نیاز به انجام یک round trip کامل که باعث تولید مجدد یک صفحه می گردد ، نمایند .
ماحصل این تحولات ، ظهور نسل جدیدی از برنامه های وب نظیر  Microsoft Virtual Earth  و   Microsoft Windows Live  است . ایجاد چنین برنامه های وبی کار ساده ای نخواهد بود و پیاده کنندگان می بایست شناخت مناسبی نسبت به جاوااسکریپت و مدل DOM  داشته باشند که ممکن است در هر مرورگر متفاوت باشد . علاوه بر این ، جاوااسکریپت تمامی ویژگی های یک زبان شی گراء را ارائه نمی نماید و بسیاری از ملزومات مورد نیاز پیاده کنندگان برنامه های وب در فریمورک دات نت را تامین نمی نماید ( نظیر type-safe ) .

ایجاد برنامه های وب با تاکید بر انجام پردازش سمت سرویس گیرنده ، نیازمند ملزوماتی نظیر
یک زبان برنامه نویسی و پلت فرم پیاده سازی جدید  است .   

AJAX ( برگرفته از asynchronous JavaScript and XML )
پیاده سازی برنامه های وب با استفاده از فن آوری های اشاره شده ( اسکریپت نویسی سمت سرویس گیرنده و مبادله غیرهمزمان با سرویس دهنده ) ،  AJAX  نامیده می شود . AJAX ، پیاده کنندگان را قادر به تولید صفحاتی می نماید که از توان پاسخگوئی بسیار مطلوبی در سمت سرویس گیرنده متناسب با رویداد ایجاده شده ، برخوردار می باشند . چراکه آنها  از اسکریپت های سمت سرویس دهنده برای دستیابی و مدیریت عناصر بخش رابط کاربر استفاده می نمایند . علاوه بر این ، با توجه به مبادله غیرهمزمان داده به منظور ارسال و دریافت داده ، امکان انجام عملیات مورد نظر بر روی داده بدون وقفه و ازدست دادن state وجود خواهد داشت .  Microsoft Virtual Earth  و برنامه سرویس گیرنده نامه های الکترونیکی Outlook Web Access  ،  دو نمونه از برنامه های سبک AJAX ، می باشند .

Atlas : تلاش‍ی در جهت ایجاد یک  پلت فرم پیاده سازی جامع 
فن آوری جدید ASP.NET با نام Atlas ، مجموعه ای از فن آوری های مایکروسافت را شامل می شود  که با تمرکز بر روی اصول AJAX ، سعی در توسعه و بهبود آن را دارد .
Atlas ، یک فن آوری جدید در عرصه پیاده سازی برنامه های وب ASP.NET است که  کتابخانه های اسکریپت سرویس گیرنده را با فریمورک پیاده سازی مبتنی بر سرویس دهنده ASP.NET 2.0 ترکیب می نماید . در واقع ، Atlas به پیاده کنندگان برنامه های وب یک پلت فرم مناسب به منظور پیاده  سازی صفحات وب مبتنی بر سرویس گیرنده را ارائه می نماید که قبلا" مشابه آن در خصوص صفحات وب مبتنی بر سرویس دهنده توسط ASP.NET ارائه شده بود . با توجه به این که Atlas ، به عنوان یک پتانسیل اضافه در کنار ASP.NET مطرح می باشد ، بدیهی است که کاملا" سازگار با سرویس های مبتنی بر سرویس دهنده باشد . با استفاده از Atlas ، می توان بخش قابل توجهی از پردازش های مورد نیاز یک برنامه را به سمت سرویس گیرنده انتقال داد ( fat-client ) . در چنین مواردی ، امکان ارتباط سرویس گیرنده با سرویس دهنده در background فراهم می گردد. ماحصل این فن آوری ، ایجاد برنامه های وبی است که علاوه بر ارائه امکانات مناسب  در لایه رابط کاربر ( UI ) ، دارای توان پاسخگوئی بالائی می باشند و به سادگی می توانند با سرویس دهنده ارتباط برقرار نمایند .

مفاهیم فنی اولیه AJAX
در AJAX ، پیاده کنندگان می توانند سرویس های وب را بطور غیرهمزمان و از طریق اسکریپت های سمت سرویس گیرنده و با استفاده از شی XMLHTTPRequest  فراخوانده تا اطلاعات به عنوان داده XML بسته بندی و در ادامه آنها را بر روی شبکه ارسال نمایند . بدین منظور شی XMLHTTPRequest یک شی پراکسی را ارائه می نماید تا به کمک آن امکان فراخوانی از راه دور و مبادله داده فراهم گردد . در فن آوری AJAX از زبان های اسکرپیت سمت سرویس گیرنده نظیر جاوااسکریپت بطرز گسترده ای استفاده می گردد . از جاوااسکریپت در مواردی نظیر فراخوانی از راه دور روتین ها ، انجام پردازش های مورد نیاز یک برنامه در سمت سرویس گیرنده و ایجاد ویژگی های پیشرفته ای در سطح لایه رابط کاربر استفاده می شود .
AJAX علاوه بر جاوااسکریپت از چندین فن آوری دیگر در سمت سرویس گیرنده نیز استفاده می نماید :

  • DOM : به کمک فن آوری فوق ، عناصر موجود در یک صفحه HTML به عنوان مجموعه ای از اشیاء استاندارد ( نظیر document و windows ) در نظر گرفته می شوند . بدین ترتیب ، امکان دستیابی  و انجام عملیات دلخواه بر روی آنان از طریق کد فراهم می گردد .

  • DHTML ( برگرفته از Dynamic HTML ) : فن آوری فوق ، توانمندی HTML را به منظور واکنش مناسب در خصوص عملیاتی که توسط کاربران انجام می شود ( نظیر درج داده ) با استفاده از اسکریپت های سمت سرویس گیرنده و بدون نیاز به یک round trip افزایش می دهد .

  • رفتارها ، شامل روشی مناسب به منظور برخورد سیستماتیک با عملیاتی نظیر drag and drop در سطح لایه رابط کاربر و مرتبط با عناصر موجود بر روی یک صفحه می باشد .

  • عناصر : اشیاء سفارشی شده جاوااسکریپت می باشند که پتانسیل های توسعه یافته ای را در سمت سرویس گیرنده ایجاد می نمایند .

چالش های فن آوری AJAX
برنامه نویسی صفحات به سبک AJAX دارای چالش های متعددی است :

  • عناصر موجود در صفحات وب می بایست متناسب با شرایط هر مرورگر برنامه نویسی گردند ، چراکه هر مرورگر یک نسخه متفاوت از DOM و DHTML را ارائه می نمایند(هر چند این تفاوت ها اندک باشد) .

  • برنامه نویسی سمت سرویس گیرنده صرفا" با استفاده از جاوااسکریپت انجام می شود . پیاده سازی برخی از پتانسیل های  AJAX می تواند برای پیاده کنندگان بسیار پیچیده باشد و نیازمند دانش بالائی در خصوص استفاده از جاوااسکریت است .

  • جاوا اسکریپت ،  ویژگی ها و امکانات مورد نیاز پیاده کنندگان برنامه های دات نت را تامین نمی نماید ( نظیر یک رویکرد شی گراء کامل ) . علاوه بر این ، در این فن آوری از کتابخانه ای نظیر آنچه در پلت فرم دات نت ارائه شده است ،‌ استفاده نمی گردد و برنامه نویسان می بایست تمامی برنامه را از ابتدا کد نمایند  .

  • جاوااسکریپت و پیاده سازی سمت سرویس گیرنده  ، عموما" بخوبی در IDEs حمایت نمی گردند .

فن آوری Atlas  ، مسائل اشاره شده را با ارائه یک فریمورک کامل برای ایجاد برنامه های وب مبتنی بر سرویس گیرنده برطرف می نماید.

فن آوری Atlas  ، 
دارای عناصر سرویس گیرنده و سرویس دهنده ای است
 که آن را  به خوبی با ASP.NET
یکپارچه و مرتبط می نماید

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

عناصر سمت سرویس گیرنده Atlas
فن آوری Atlas برای پیاده سازی برنامه های سمت سرویس گیرنده ، از مجموعه ای کتابخانه سمت سرویس گیرنده ( فایل هائی با انشعاب Js . ) استفاده می نماید که پیامد آن تعریف یک رویکرد لایه ای برای ایجاد برنامه های مبتنی بر سرویس گیرنده است . این لایه ها عبارتند از :

  • لایه مختص  مرورگرها : با استفاده از پتانسیل های ارائه شده توسط این لایه ، اسکریپت های Atlas در اکثر مرورگر سازگار بوده و ضرورتی به نوشتن اسکریت های مختص یک مرورگر وجود ندارد .

  • سرویس های هسته atlas : شامل ضمائمی به جاوااسکریپت نظیر کلاس ها ، namespace ، event handler ، توارث ، نوع های داده و تسلسل اشیاء است . ویژگی های فوق یک مدل برنامه نویسی شی گراء را در اختیار پیاده کنندگان قرار می دهد تا به کمک بتوان علاوه بر سرعت در ایجاد برنامه ها از کد تولید شده نیز بدفعات استفاده نمود.

  • کتابخانه کلاس پایه Atlas : شامل عناصری نظیر دیباگرها ، Timers ، ردیابی و string buliders است .

  • لایه شبکه : این لایه با سرویس های مبتنی بر وب و برنامه ها ارتباط برقرار می نماید و  مدیریت فراخوانی متدها از راه دور و غیرهمزمان را برعهده می گیرد . لایه فوق ، مدیریت فراخوانی غیرهمزمان برروی XMLHTTP  را برعهده گرفته و باعث می گردد که پیاده کنندگان بدون این که درگیر پیچیدگی های موجود شوند با نوشتن چندین خط کد ، متدهای مورد نظر را فراخوانند .

  • لایه UI  : در این لایه قابلیت های سرویس گیرنده Atlas نظیر رفتارها ، گرامر تعریفی Atlas ، عناصر UI و نسبت دهی داده  ارائه می گردد .

  • لایه کنترل ها : این لایه کنترل های مختص atlas را برای پیاده سازی سمت سرویس گیرنده ایجاد می نماید . علاوه بر این که می توان از طریق اسکریپت به این کنترل ها دستیابی داشت ، امکان انجام عملیات متفاوتی نظیر نسبت دهی داده نیز وجود دارد. کنترل های  Navigation و data-bound listview نمونه هائی در این زمینه می باشند . 

  •  یک مدل برنامه نویسی تعریفی که پیاده کنندگان را قادر می سازد عناصر atlas را با روشی مشابه کنترل های سرویس دهنده ASP.NET ایجاد نمایند .

فن آوری Atlas  را می توان
به عنوان کتابخانه های اسکریپت سرویس گیرنده تصور نمود که زیرمجموعه ای از معماری ASP.NET بر روی ‌سرویس دهنده می باشند

برای پیاده سازی برنامه های وب سمت سرویس گیرنده ، فن آوری Atlas  ویژگی های متعددی را ارائه می نماید . ارائه یک مجموعه API برای پیاده سازی در جاوااسکریپت ، قابلیت سازگاری اتوماتیک با مرورگرها و یک مدل تعریفی برای پیاده سازی سمت سرویس گیرنده ، نمونه هائی در این زمینه م‍ی باشند . 

عناصر سمت سرویس دهنده Atlas
فن آوری Atlas ، صرفا" در ارتباط با اسکریپت های سمت سرویس گیرنده نمی باشد و از عناصر سمت سرویس دهنده ، سرویس ها و کنترل هائی استفاده می نماید که می توانند با اسکریپت های Atlas سمت سرویس گیرنده مرتبط گردند :

  • سرویس های وب که ویژگی های ASP.NET نظیر سرویس های پروفایل ، membership ، roles ، personalization  و globalization را ارائه می نمایند .

  • کنترل های سرویس دهنده Atlas که کنترل های سرویس دهنده ASP.NET را reasemble می نمایند ولی اسکریپت های سمت سرویس گیرنده Atlas را منتشر می نمایند . این نوع کنترل ها ارتباط بسیار نزدیکی با کنترل های سرویس دهنده ASP.NET نظیر دکمه ها ، Label و ... دارند .

  • کنترل های سرویس دهنده Atlas که باعث می گردند جاوااسکریپت رفتارهای سمت سرویس گیرنده را تولید نماید . کنترل های  HoverBehavior  ، ClickBehavior ، Popup و  AutocompleteBehavior نمونه هائی در این زمینه می باشند .

  • تمامی کنترل های سرویس دهند atlas در ویژوال استودیو نیر قابل استفاده می باشند. بنابراین می توان از آنان در زمان طراحی استفاده نمود ( همانند کنترل های سرویس دهنده ASP.NET  ) .

 فن آوری Atlas ، اسکریپت نویسی سمت سرویس گیرنده را با پیاده سازی سمت سرویس دهنده ASP.NET یکپارچه می نماید و پیاده کنندگان می توانند از پتانسیل های ASP.NET در سمت سرویس دهنده برای برنامه های Atlas نیز استفاده نمایند . 

هدف اولیه فن آوری Atlas   ، 
ترکیب  ویژگی اسکریپت های سمت سرویس گیرنده با ویژگی هائی از ASP.NET بر روی سرویس دهنده است تا به کمک آن
یک پلت فرم پیاده سازی جامع و فراگیر ایجاد گردد .

اصول امنیت برنامه های وب ( بخش دوم )

در  بخش اول به این موضوع اشاره گردید که به منظور ایجاد برنامه های وب ایمن ، می بایست از یک رویکرد جامع تبعیت و بر روی سه لایه متفاوت شبکه ، host و برنامه متمرکز گردید. در این بخش به  بررسی ایمن سازی شبکه خواهیم پرداخت .

ایمن سازی شبکه
شبکه ، نقطه ورود به یک برنامه وب است و  اولین لایه حفاظتی به منظور کنترل دستیابی به سرویس دهندگان متعدد موجود در محیط عملیاتی را فراهم می نماید . با این که سرویس دهندگان توسط سیستم های عامل نصب شده بر روی خود حفاظت می گردند ولی نمی بایست به این موضوع صرفا" اکتفاء نمود و لازم است که تدابیر لازم به منظور حفاظت آنها در مقابل سایر تهدیدات ( نظیر ارسال سیلابی ‌از بسته های اطلاعاتی از طریق لایه شبکه ) نیز اندیشیده گردد .
ایمن سازی شبکه ، شامل حفاظت از دستگاه های شبکه ای و داده مبادله شده بر روی آنها می باشد . روتر ،‌ فایروال و سوئیچ عناصر اولیه زیرساخت یک شبکه را تشکیل می دهند . شکل زیر نحوه استفاده از عناصر فوق را در یک شبکه نشان می دهد .  

   عناصر شبکه : روتر ،‌ فایروال و سوئیچ
  عناصر شبکه : روتر ،‌ فایروال و سوئیچ

یک برنامه وب بر روی یک زیرساخت شبکه ای ایمن فعالیت و به کاربران خود سرویس های لازم را ارائه می نماید . برای ایمن سازی شبکه ، علاوه بر این که شبکه می بایست در مقابل حملات مبتنی بر TCP/IP از خود محافظت نماید ، بلکه لازم است اقدامات متعدد دیگری نیز در این رابطه انجام شود . ایجاد اینترفیس های مدیریتی ایمن، استفاده از رمزهای عبور قدرتمند ، حصول اطمینان از صحت ترافیک ارسالی از جمله اقدامات دیگر در خصوص ایجاد یک شبکه ایمن می باشد . بدین منظور لازم است که   پورت ها و پروتکل های استفاده شده در هر لایه به دقت بررسی و در صورتی که وجود آنها غیرضروری تشخیص داده شود و یا استفاده از آنها زمینه بروز تهدیداتی را فراهم می نماید ،‌ می بایست در همان لایه با آنان برخورد و از یک راهکار مناسب امنیتی استفاده گردد . 
وجود ضعف امنیتی در یک شبکه زمینه بروز تهدیدات متعددی را فراهم می نماید . بدون شناسائی اینگونه تهدیدات ، امکان مقابله منطقی با آنان وجود نخواهد داشت . 

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

  • جمع آوری اطلاعات
  • sniffing
  • spoofing
  • session hijacking
  • DoS ( برگرفته از Denial of Service )

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

جمع آوری اطلاعات
مهاجمان در اولین مرحله ،‌اقدام به جمع آوری اطلاعات در رابطه با اهداف خود می نمایند . جمع آوری اطلاعات می تواند باعث افشای اطلاعات توپولوژی شبکه ، پیکربندی سیستم و دستگاه های شبکه ای گردد . یک مهاجم می تواند در ادامه با استفاده از اطلاعات جمع آوری شده بر روی نقاط آسیب پذیر متمرکز و از حفره های امنیتی موجود در جهت تامین خواسته های مخرب خود استفاده نماید .

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

  • ماهیت غیرایمن ذاتی پروتکل TCP/IP
  • پیکربندی ضعیف دستگاه های شبکه ای
  • استفاده غیرایمن از سرویس هائی که به وجود آنها در یک شبکه نیاز نمی باشد .

حملات
متداولترین حملات مبتنی بر "جمع آوری اطلاعات"  عبارتند از :

  • استفاده از Tracert به منظور تشخیص توپولوژی شبکه
  • استفاده از Telnet به منظور باز نمودن پورت ها و جمع آوری اطلاعات اولیه 
  • استفاده از پویشگرهای پورت به منظور تشخیص وضعیت پورت ها 
  • استفاده از درخواست های broadcast برای شمارش تعداد host موجود بر روی یک subnet

پیشگیری و مقابله با تهدیدات 
به منظور پیشگیری و مقابله با این نوع حملات می توان از روش های زیر استفاده نمود :

  • استفاده از امکاناتی که اطلاعات اضافه ای را در خصوص پیکربندی نظیر نام و شماره نسخه نرم افزار ارائه نمی نماید .
  • استفاده از فایروال ها به منظور پوشش سرویس هائی که نمی بایست در معرض دید و استفاده عموم قرار داده شوند .

sniffing
sniffing که به آن "استراق سمع "  نیز گفته می شود ، مانیتورینگ ترافیک شبکه برای داده هائی نظیر رمزهای عبور ( رمزنشده) و یا اطلاعات پیکربندی است . با استفاده از یک برنامه  packet sniffer  ، می توان به سادگی تمامی ترافیک plain text  ( رمز نشده ) را مشاهده نمود .

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

  • ضعف امنیت فیزیکی
  • ضعف رمزنگاری در زمان ارسال داده حساس  و مهم
  • وجود سرویس هائی که با یکدیگر به صورت متن معمولی ( رمز نشده ) ارتباط برقرار می نمایند .
  • استفاده از الگوریتم های ضعیف رمزنگاری

حملات
مهاجمان با قرار دادن یک  packet sniffer  بر روی شبکه می توانند تمامی ترافیک را capture و  آنالیز نمایند .

پیشگیری و مقابله با تهدیدات 
به منظور پیشگیری و مقابله با این نوع حملات می توان از روش های زیر استفاده نمود :

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

Spoofing
spoofing ، که به آن "هویت مبهم "  نیز گفته می شود  ، به کتمان هویت واقعی بر روی شبکه اطلاق می گردد . در این رابطه از یک آدرس مبداء جعلی که بیانگر آدرس اولیه صادرکننده پیام نمی باشد ، استفاده می گردد . در بسیاری موارد از spoofing به منظور مخفی کردن منبع بروز یک تهاجم استفاده می شود. در برخی موارد که دستیابی به منابع موجود بر روی شبکه بر اساس آدرس متقاضیان انجام می شود ، مهاجمان با تغییر آدرس مبداء سعی می نمایند به اینگونه از منابع دستیابی پیدا نمایند .

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

  • ماهیت غیرایمن ذاتی پروتکل TCP/IP

  • ضعف در فیلترینگ بسته های اطلاعاتی ورودی و خروجی : ترافیک ورودی و خروجی شبکه به درستی کنترل و فیلتر نمی گردد (ingress & egress filtering )

 حملات
یک مهاجم می تواند از ابزارهای متعددی به منظور تغییر آدرس بسته های خروجی استفاده نماید تا اینچنین وانمود نماید که آنها از یک host و یا شبکه دیگر ارسال شده اند .

پیشگیری و مقابله با تهدیدات 
به منظور پیشگیری و مقابله با این نوع حملات می توان از از فیلترینگ egress و ingress بر روی روتر های perimeter استفاده نمود .


session Hijacking
با استفاده از این نوع حملات که به آنها man in middle نیز گفته می شود ، مهاجمان می توانند از یک برنامه برای تغییر شکل ظاهری خود  به عنوان یک سرویس گیرنده و یا سرویس دهنده موجه استفاده نمایند . بدین ترتیب ، یک سرویس دهنده و یا سرویس گیرنده واقعی فریب خورده و فکر می کنند که با یک host معتبر و مجاز ارتباط برقرار نموده اند . در واقع ، این نوع کامپیوترهای میزبان متعلق به مهاجمان بوده که سعی می نمایند با دستکاری شبکه خود را به عنوان مقصد مورد نظر وانمود نمایند . از این نوع حملات به منظور آگاهی از اطلاعات logon و دستیابی به سیستم و سایر اطلاعات محرمانه استفاده می گردد .

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

  • ضعف در امنیت فیزیکی
  • ماهیت غیرایمن ذاتی پروتکل TCP/IP
  • مبادله اطلاعات به صورت رمزنشده

 حملات
یک مهاجم می تواند از ابزارهای متعددی به منظور انجام عملیات spoofing ، تغییر روتینگ و دستکاری بسته های اطلاعاتی استفاده نماید. 

پیشگیری و مقابله با تهدیدات 
به منظور پیشگیری و مقابله با این نوع حملات می توان از روش های زیر استفاده نمود :

  • رمزنگاری Session
  • استفاده از روش Stateful inspection در سطح فایروال

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

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

  • ماهیت غیرایمن ذاتی پروتکل TCP/IP
  • ضعف در پیکربندی روتر و سوئیچ
  • باگ در سرویسهای نرم افزاری

 حملات
متداولترین حملات DoS عبارتند از :

  • ارسال سیلابی از بسته های اطلاعاتی نظیر حملات cascading broadcast
  • بسته های اطلاعاتی SYN flood
  • سوء استفاده از برخی سرویس ها 

پیشگیری و مقابله با تهدیدات 
به منظور پیشگیری و مقابله با این نوع حملات می توان از روش های زیر استفاده نمود : 

  • فیلترینگ درخواست های broadcast
  • فیلترینگ درخواست های ICMP ( برگرفته از  Internet Control Message Protocol )
  • بهنگام سازی و نصب patches سرویس های نرم افزاری

بدون آنالیز صحیح تهدیدات ،
 امکان ایجاد یک محیط و یا شبکه ایمن وجود نخواهد داشت .

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

اصول امنیت برنامه های وب ( بخش اول )

اینترنت و به دنبال آن وب ، دنیای نرم افزار را دستخوش تحولات فراوانی نموده است . ظهور نسل جدیدی از برنامه های کامپیوتری موسوم به "برنامه های وب " از جمله این تحولات عظیم است . پس از ارائه سرویس وب در سال 1991، وب سایت های متعددی ایجاد گردید .  اینگونه سایت ها به منظور ارائه اطلاعات به مخاطبان خود از صفحات وب ایستا استفاده می کردند . در چنین وب سایت هائی ، امکان تعامل کاربر با برنامه وجود نداشت .
با توجه به این که رویکرد فوق با ماهیت و یا روح  نرم افزار چندان سازگار نمی باشد ، تلاش های گسترده ای در جهت ایجاد محتویات پویا انجام و متعاقب آن ، فن آوری های متعددی ایجاد گردید . به عنوان نمونه ، با پیاده سازی فن آوری CGI ( برگرفته از Common Gateway Interface  ) ، امکان استفاده از برنامه های خارجی به منظور تولید محتویات پویا فراهم گردید . بدین ترتیب ، کاربران قادر به درج اطلاعات و ارسال آنها برای یک برنامه خارجی و یا اسکریپت سمت سرویس دهنده شدند . برنامه موجود در سمت سرویس دهنده پس از دریافت اطلاعات و انجام پردازش های تعریف شده ، نتایج را تولید و آنها را برای کاربر ارسال می نمود .
رویکرد فوق ،‌ به عنوان نقطه عطفی در برنامه های وب تلقی می گردد چراکه برای اولین مرتبه امکان تولید محتویات پویا در وب سایت ها فراهم گردید . از آن زمان تاکنون فن آوری های متعددی به منظور تولید برنامه های وب ایجاد شده است .  PHP و ASP.NET نمونه هائی در این زمینه می باشند .  صرفنظر از این که از کدام فن آوری به منظور ایجاد برنامه های وب استفاده می گردد ، ایمن سازی آنان از جمله اهداف مشترک تمامی پیاده کنندگان است .

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

امنیت برنامه های وب را می بایست با توجه به
نوع معماری و رفتار آنان بررسی نمود .

برداشت های غیرواقعی از امنیت برنامه های وب
متاسفانه به دلیل عدم شناخت لازم در خصوص ماهیت برنامه های وب از یک طرف و از سوی دیگر عدم آشنائی لازم با مفاهیم امنیت  ،‌ شاهد برداشت های نادرست در خصوص امنیت برنامه های وب می باشیم . اجازه دهید به چند نمونه در این خصوص اشاره نمائیم :

  • ما ایمن هستیم چون از یک فایروال استفاده می نمائیم . این تصور کاملا" اشتباه است و به نوع تهدید بستگی خواهد داشت . مثلا" یک فایروال قادر به تشخیص داده ورودی مخرب جهت ارسال به یک برنامه وب نمی باشد .  فایروال ها دارای عملکردی قابل قبول در رابطه با اعمال محدودیت بر روی پورت ها می باشند  و برخی از آنان می توانند همزمان با بررسی اطلاعات مبادله شده ،‌ امکانات برجسته حفاظتی را ارائه نمایند . فایروال ها جزء لاینفک در یک فریمورک امنیتی می باشند ولی نمی توان آنان را به عنوان یک راهکار جامع به منظور ایجاد و برپائی یک محیط ایمن در نظر گرفت .

  • ما ایمن هستیم چون از  SSL ( برگرفته ازSecure Sokets Layer ) استفاده می نمائیم SSL برای رمزنگاری ترافیک موجود بر روی شبکه یک گزینه ایده آل است ولی قادر به بررسی داده ورودی یک برنامه نمی باشد .

  • ما ایمن هستیم چون از سیستم عاملی استفاده می نمائیم که نسبت به سایر سیستم های عامل دارای امنیت بیشتری است . استدلال فوق با فرض درست بودن اصل قضیه ، نادرست و غیرمنطقی است چراکه امنیت یک فرآیند است نه یک محصول . بنابراین با بکارگیری یک محصول خاص ( به عنوان نمونه یک سیستم عامل ) نمی توان این ادعا را داشت که ما به یک محیط ایمن به منظور ایجاد برنامه های وب دست یافته ایم .

 با رد امنیت یک سیستم عامل نمی توان امنیت یک سیستم عامل دیگر را تائید نمود.
 ( من خوبم چون شما بد هستید ! )

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

  • Authentication ،  فرآیندی است که به کمک آن به صورت منحصربفرد سرویس گیرندگان یک برنامه شناسائی می گردند . کاربران ،  سرویس ها ، فرآیندها و کامپیوترها ،  نمونه هائی از سرویس گیرندگان یک برنامه می باشند . در واقع ، authentication هویت استفاده کنندگان یک برنامه را بررسی می نماید .

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

  • Auditing :  ممیزی موثر و ثبت عملیات انجام شده یکی از اصول مهم در جلوگیری از انجام اعمال خلاف قانون است . بدین ترتیب این اطمینان ایجاد خواهد شد که یک کاربر نمی تواند باعث عدم انحام یک کار و یا فعالیت در سیستم گردد و یا یک تراکنش را مقداردهی اولیه نماید . مثلا" در یک سیستم e-commerce  می بایست از مکانیزم هائی استفاده گردد تا این اطمینان حاصل گردد که یک مصرف کننده نمی تواند سفارش انجام شده برای خرید یکصد نسخه از یک کتاب را انکار نماید .

  • Confidentiality ، که از آن با نام privacy نیز نام برده می شود ، فرآیندی است که به کمک آن این اطمینان ایجاد می گردد که حریم خصوصی داده رعایت و امکان مشاهده آن توسط کاربران غیرمجاز و یا سایر افرادی که  قادر به ردیابی ترافیک یک شبکه می باشند ، وجود نخواهد داشت . 

  •  Integrity ، فرآیندی است که به کمک آن این اطمینان ایجاد می گردد که داده در مقابل تغییرات تصادفی و یا تعمدی حفاظت خواهد شد . همانند privacy ، یکپارچگی اطلاعات یک فاکتور اساسی در خصوص امنیت داده محسوب می گردد ، خصوصا" در مواردی که داده در طول شبکه مبادله خواهد شد . یکپارچگی داده در حال حمل ،‌عموما" با استفاده از روش هائی نظیر hashing و یا کدهای تائید پیام انجام می شود .

  • Availability ، فرآیندی است که به کمک آن این اطمینان ایجاد خواهد شد که همواره داده برای کاربران مجاز در دسترس و قابل استفاده خواهد بود . در اغلب حملات از نوع DoS ، مهاجمان این هدف را دنبال می نمایند که بتوانند امکان استفاده و در دسترس بودن برنامه برای کاربران مجاز را غیرممکن و عملا" آن را از کار بیندازند .

تعاریف اولیه برخی از  اصطلاحات امنیتی : تهدیدات ، نقاط آسیب پذیر و حملات

  • تهدید ( threat ) : به هرگونه پتانسیل بروز یک رویداد مخرب و یا سایر موارد دیگر که می تواند به سرمایه های یک سازمان آسیب برساند ، تهدید  گفته می شود . به عبارت دیگر، هر رویدادی که بتواند به سرمایه های یک سازمان آسیب برساند ، در زمره تهدیدات محسوب می گردد . 

  • نقاط آسیب پذیر (vulnerability) : ضعف های موجود در یک سیستم می باشند که پتانسیل اولیه بروز یک رویداد مخرب را فراهم می نمایند . ضعف در طراحی ، پیکربندی اشتباه ، استفاده از روش های کدینگ غیرایمن مهمترین دلایل ایجاد یک ضعف در سیستم می باشند . ضعف در بررسی صحت داده ورودی توسط کاربر ، نمونه ای از یک لایه آسیب پذیر در یک برنامه است که می تواند زمینه بروز یک تهاجم را فراهم نماید .

  • تهاجم (attack) : عملیاتی است که محوریت آن سوء استفاده از نقاط آسیب پذیر و پتانسیل های بروز یک رویداد مخرب می باشد .  ارسال ورودی مخرب به یک برنامه و یا flooding یک شبکه به منظور از کار انداختن یک سرویس ، نمونه هائی در این زمینه می باشد .

یک تهدید پتانسیل بروز یک رویداد مخرب را فراهم می نماید که می تواند به سرمایه های یک سازمان آسیب برساند
 در حالی که در یک تهاجم موفقیت آمیز از نقاط آسیب پذیر موجود در سیستم استفاده می گردد .

چگونه می توان یک برنامه وب ایمن را ایجاد نمود ؟
تا زمانی که شناخت مناسبی نسبت به تهدیدات وجود نداشته باشد ، امکان ایجاد یک برنامه وب ایمن وجود نخواهد داشت . بنابراین قبل از هر چیز لازم است که با "مدل تهدیدات " موجود آشنا شویم . هدف مدل فوق، آنالیز معماری و نحوه طراحی برنامه به منظور شناسائی نقاط آسیب پذیری است که ممکن است به صورت تصادفی توسط یک کاربر ناآگاه و یا مهاجمان با اهداف مخرب مورد سوء استفاده قرار گرفته تا با استناد به آنان بتوانند موجودیت و امنیت  سیستم را با خطر مواجه نمایند  .
پس از آسنائی با تهدیدات ، می بایست با بکارگیری مجموعه ای از اصول امنیتی اقدام به طراحی سیستم نمود . در ادامه ، پیاده کنندگان می بایست از روش های ایمن به منظور نوشتن کدهای مطمئن ، مستحکم و قابل اعتماد استفاده نمایند . پس از طراحی و پیاده سازی برنامه ، می بایست از یک شبکه ایمن ، یک host مطمئن و یک پیکربندی مناسب بر روی سرویس دهنده ،‌ استفاده گردد .
ایجاد یک برنامه وب ایمن ، مستلزم اقدامات امنیتی چند جانبه ای است  که موفقیت در تمامی آنان ، ایمن بودن برنامه های‌ وب را تضمین خواهد کرد . ایمن سازی شبکه ، host و برنامه ، رئوس مثلث امنیتی ایجاد برنامه های وب ایمن را تشکیل می دهند .

ایمن سازی شبکه ، host و برنامه
به منظور  ایجاد برنامه های وب ایمن ، تبعیت از یک رویکرد جامع امری است الزامی . بنابراین ، می بایست امنیت برنامه های‌ وب را در سه لایه متفاوت بررسی و اقدامات لازم را در هر لایه با توجه به جایگاه آن انجام داد . شکل زیر سه لایه مهم به منظور ایجاد برنامه های وب ایمن را نشان می دهد .

 وجود یک نقطه آسیب پذیر در شبکه به یک مهاجم اجازه می دهد تا کنترل یک host  و یا برنامه را بدست بگیرد .

وجود یک نقطه آسیب پذیر در host  به یک مهاجم اجازه می دهد تا بتواند کنترل یک شبکه و یا برنامه را بدست بگیرد .

وجود یک نقطه آسیب پذیر در برنامه به یک مهاجم اجازه می دهد تا کنترل یک host  و یا شبکه را بدست بگیرد .

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

روش های حفاظت از داده

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

  • تهیه Backup در اولین فرصت و به صورت مرتب : تهیه backup  بطور مرتب و بر اساس یک استراتژی خاص ، یکی از اقدامات اساسی در جهت حفاظت از اطلاعات می باشد . اطلاعاتی که ممکن است به هر دلیلی با مشکل مواجه و امکان استفاده از آنان وجود نداشته باشد .  برای تهیه backup ، می توان از امکانات موجود در ویندوز نظیر برنامه ntbackup استفاده نمود . با استفاده از ویزارد ارائه شده در برنامه فوق ،  می توان به سرعت و به سادگی عملیات لازم به منظور تهیه backup و یا برگرداندن اطلاعات backup گرفته شده را انجام داد . در صورت ضرورت ، می توان تهیه backup از داده های مهم موجود بر روی سیستم را به صورت یک job تعریف و برای آن یک برنامه زمانبندی خاص را در نظر گرفت .
    برای تهیه backup ، می توان از نرم افزارهای متعدد دیگری نیز استفاده نمود که امکانات بمراتب بیشتری را در مقایسه با برنامه ارائه شده در ویندوز در اختیار کاربران قرار می دهند . صرفنظر از این که از چه برنامه ای برای تهیه backup استفاده می گردد ، می بایست از اطلاعات backup گرفته شده به دقت حفاظت و آنها را در مکان هائی با ضریب ایمنی و حفاظتی بالا نگهداری کرد . 

  • استفاده از مجوزهای امنیتی file-level و share-level  : به منظور حفاظت از داده در مقابل دستیابی افراد غیرمجاز ، اولین مرحله تنظیم مجوزها بر روی فایل ها و فولدرهای حاوی داده می باشد .در صورتی که می بایست داده به صورت مشترک در شبکه استفاده گردد ، می توان با تنظیم share permissions  نحوه استفاده از آنها را قانونمند نمود . بدین منظور می توان در ویندوز 2000 و یا XP  پس از انتخاب فایل و یا فولدر ، از طریق صفحه Properties گزینه Sharing و در نهایت دکمه  permission  را انتخاب نمود . تنظیمات امنیتی اشاره شده در رابطه با کاربرانی که به صورت محلی از سیستم حاوی اطلاعات حساس استفاده می نمایند ، اعمال نخواهد شد .
    در صورتی که کامپیوتر با کاربر دیگری به اشتراک گذاشته شده است ، می بایست از مجوزهای file-level استفاده نمود . به این نوع از مجوزها ، مجوزهای     NTFS  نیز گفته می شود چراکه استفاده از آنها صرفا" برای فایل ها و فولدرهای ذخیره شده بر روی پارتیشن هائی که با سیستم فایل NTFS فرمت شده اند ، امکان پذیر می باشد . برای استفاده از مجوزهای فوق ، پس از انتخاب فایل و یا فولدر مورد نظر می توان از طریق صفحه properties ، گزینه Security tab را انتخاب و مجوزها را بر اساس سیاست مورد نظر تنظیم نمود . 
    در هر دو مورد ( مجوزهای file-level و share-level ) می توان مجوزها را برای user account و groups تعریف نمود . مجوزها را می توان از  "فقط خواندنی" تا " کنترل کامل " در نظر گرفت .

  • حفاظت از فایل ها و سایر مستندات توسط رمز عبور : تعداد زیادی از نرم افزارها ( نظیر نرم افزارهای آفیس و Adobe Acrobat ) ، امکان تعریف رمزعبور برای استفاده از مستندات را در اختیار کاربران قرار می دهند . پس از در نظر گرفتن یک رمز عبور ، در صورت فعال کردن ( بازنمودن ) یک مستند در ابتدا از کاربر درخواست رمز عبور خواهد شد . به منظور انجام این کار در برنامه ای نظیر Microsoft word 2003 ، از طریق منوی Tools گزینه options  و در ادامه Security tab را انتخاب می نمائیم . با استفاده از امکانات فوق ، می توان یک رمز عبور و نحوه رمزنگاری را مشخص نمود .
    متاسفانه، سیستم رمز استفاده شده در محصولات مایکروسافت ، به سادگی شکسته می گردد و کاربران غیرمجاز می توانند از برنامه های متعددی به منظور رمزگشائی مستندات استفاده نمایند. برنامه AOPR  ( برگرفته از Advanced Office Password Recovery  )  نمونه ای در این زمینه می باشد .
    در صورت لزوم می توان از  نرم افزارهائی نظیر WinZip و PKZip به منظور فشرده سازی و رمزنگاری اسناد و یا فایل ها استفاده نمود .

  • استفاده از رمزنگاری EFS : ویندوز 2000 ، XP و 2003 از رمزنگاری سیستم فایل موسوم به EFS ( برگرفته از Encrypting File System ) حمایت می نمایند . از سیستم رمزنگاری فوق می توان به منظور رمزنگاری فایل ها و فولدرهای ذخیره شده بر روی پارتیشنی که با NTFS فرمت شده است ،‌استفاده نمود . بدین منظور می توان پس از انتخاب صفحه properties ، از طریق General tab گزینه Advanced button را انتخاب نمود ( بطور همزمان نمی توان از رمزنگاری EFS و مجوزهای NTFS استفاده نمود ) .
    سیستم رمزنگاری EFS به منظور افزایش امنیت و کارآئی از ترکیب رمزنگاری متقارن و نامتقارن استفاده می نماید . سیستم فوق برای حفاظت از داده های ذخیره شده بر روی دیسک استفاده می گردد و در صورتی که یک فایل رمز شده در طول شبکه حرکت کند و کاربران از یک sniffer به منظور capture بسته های اطلاعاتی استفاده نمایند ، می توانند اطلاعات موجود در فایل را مشاهده نمایند .

  • استفاده از رمزنگاری ‌دیسک : با استفاده از نرم افزارهای متعددی می توان تمامی محتویات یک دیسک را رمز نمود . بدین ترتیب ، کاربران غیرمجاز قادر به  مشاهده محتویات ذخیره شده بر روی دیسک نخواهند بود .  داده بطور اتومانیک و در زمان نوشتن بر روی هارد دیسک رمز  و قبل از استقرار درون حافظه ، رمزگشائی می گردد . از اینگونه محصولات می توان به منظور رمزنگاری درایوهای USB ، فلش درایوها و ... استفاده نمود . PGP Whole Disk Encryption و DriveCrypt نمونه هائی از اینگونه برنامه ها می باشند .

  • استفاده از زیرساخت کلید عمومیPKI ( برگرفته از public key infrastructure ) ، سیستمی برای مدیریت زوج کلید خصوصی و عمومی و گواهینامه های دیجیتال است . با توجه به این که کلید ها و گواهینامه ها توسط یک مرکز تائید شده  صادر می شوند از استحکام امنیتی بیشتری برخوردار می باشند . (سرویس دهندگان گواهینامه دیجیتال ممکن است به صورت داخلی و در یک شبکه خصوصی نصب و یا در یک شبکه عمومی ، نظیر Versign  ، نصب شده باشند ) . در چنین مواردی ، می توان داده را با استفاده از کلید عمومی کاربر مورد نظر رمز نمود . در ادامه، صرفا" کاربری قادر به رمزگشائی اطلاعات است که دارای کلید خصوصی مرتبط با کلید عمومی باشد .

  • مخفی کردن داده درون داده دیگر : با استفاده از یک برنامه  steganography می توان داده مورد نظر را درون سایر داده ها مخفی نمود . به عنوان نمونه ، می توان یک پیام متن را درون یک فایل گرافیکی JPG . و یا فایل موزیک mp3 . ، مخفی نمود . اینگونه ها برنامه ها پیام ها را رمز نمی نمایند و  اغلب از آنان به همراه نرم افزارهای رمزنگاری استفاده می گردد . در چنین مواردی ، در ابتدا داده رمز و در ادامه با استفاده از نرم افزارهای  steganography مخفی می گردد . برنامه StegoMagic  یک نمونه از برنامه های  steganography  است که با استفاده از آن می توان متن مورد نظر را رمز و درون فایل هائی از نوع WAV ، . TXT . و یا BMP . ذخیره نمود .

  • حفاظت داده در حال حمل : داده ارسالی در یک شبکه می تواند در زمان حرکت توسط مهاجمان شنود گردد . مهاجمان در این رابطه از نرم افزارهائی موسوم به sniffer استفاده می نمایند که امکان آنالیز پروتکل و یا مانیتورینگ شبکه را در اختیار آنان قرار می دهد. برای حفاظت داده در زمان حرکت در شبکه ، می توان از IPSec ( برگرفته از Internet Protocol Security ) استفاده نمود . در چنین مواردی ، سیستم ارسال کننده و سیستم دریافت کننده می بایست قادر به حمایت از ویژگی فوق باشند . از ویندوز 2000 به بعد ، امکانات لازم به منظور حمایت از IPSec  در سایر نسخه ها تعبیه شده است .  

  • ایمن سازی مبادله داده در محیط های wireless : داده ئی که از طریق یک شبکه wireless ارسال می گردد ، دارای استعداد بیشتری به منظور بررسی و شنود توسط مهاجمان نسبت به سایر داده های ارسال شده بر روی‌ یک شبکه اترنت است ،‌ چراکه  ضرورتی ندارد مهاجمان به محیط فیزیکی شبکه و یا دستگاه های مربوطه دستیابی داشته باشند . در صورت عدم پیکربندی صحیح و ایمن access point ، مهاجمان با استفاده از یک کامپیوتر قابل حمل که دارای امکانات wireless است ، می توانند به داده ذخیره شده در شبکه دستیابی داشته باشد .  کاربران می بایست صرفا" اقدام به ارسال و دریافت داده بر روی شبکه هائی نمایند که از رمزنگاری WPA ( برگرفته از Wi-Fi Protected Access ) در مقابل WEP ( برگرفته از Wired Equivalent Protocol ) استفاده می نمایند ( WPA  ، بمرابت دارای امنیت بیشتری نسبت به WEP است ) . 

  • استفاده از مدیریت حقوق به منظور حفظ کنترل  : در برخی موارد ، لازم است که داده برای سایر کاربران ارسال گردد ولی نگران نحوه برخورد آنان با داده ارسالی می باشیم ( مثلا" آیا آنان می توانند داده ارسالی را حذف و یا تغییر دهند ) . در چنین مواردی می توان از RMS ( برگرفته از Rights Management Services ) در ویندوز استفاده نمود . سیستم فوق ، مشخص می نماید که دریافت کننده پس از دریافت اطلاعات قادر به انجام چه کاری خواهد بود . به عنوان نمونه ، می توان حقوق مورد نظر را بگونه ای تنظیم نمود که صرفا" دریافت کننده قادر به مطالعه فایل ارسالی باشد و نتواند در آن تغییراتی را اعمال نماید .  همچنین ، با استفاده از سیستم فوق می توان مدت زمان استفاده از  مستندات و یا پیام ها را مشخص نمود . بدین ترتیب پس از گذشت مدت زمان مشخص شده ، اعتبار آنها به اتمام رسیده و عملا" امکان دستیابی  و استفاده از آنها وجود نخواهد داشت . 
    برای استفاده از RMS ، به ویندوز 2003 که به عنوان یک سرویس دهنده RMS پیکربندی شده است نیاز می باشد . در چنین مواردی ، کاربران نیز به یک نرم افزار خاص و یا یک add-in همراه مرورگر نیاز خواهند داشت تا بتوانند به مستندات حفاظت شده توسط RMS دستیابی داشته باشند . کاربران مجاز یک گواهینامه را از سرویس دهنده RMS دریافت می نمایند .