جستجو در محصولات

گالری پروژه های افتر افکت
گالری پروژه های PSD
جستجو در محصولات


تبلیغ بانک ها در صفحات
ربات ساز تلگرام در صفحات
ایمن نیوز در صفحات
.. سیستم ارسال پیامک ..
كنترل هاي Validation در ASP.NET
-(1 Body) 
كنترل هاي Validation در ASP.NET
Visitor 584
Category: دنياي فن آوري
بررسي و ارزيابي صحت اطلاعات ورودي توسط كاربران ، يكي از عمليات بسيار مهم در برنامه هاي كامپيوتري خصوصا" برنامه هاي وب با توجه به ماهيت معماري آنها مي باشد . پياده كنندگان برنامه هاي وب مي بايست پس از درج داده ورودي توسط كاربر و قبل از ارسال آن به لايه هاي ديگر ، آنها را ارزيابي و صرفا" پس از تائيد ، پردازش هاي مورد نياز را بر روي آنها انجام دهند . اعتقاد عملي به سياست فوق باعث پيشگيري تعداد زيادي از حملات در برنامه هاي‌ وب مي گردد . در صورت عدم رعايت موارد اشاره شده ، شرايط لازم به منظور سوء استفاده از پتانسيل فوق فراهم و مهاجمان مي توانند با بهره برداري از نقاط ضعف موجود ، حملات خود را برنامه ريزي نمايند .
در اين مقاله به بررسي امكانات ارائه شده در ASP.NET به منظور ارزيابي صحت داده ورودي خواهيم پرداخت . آشنائي و بكارگيري روش هاي مناسب به منظور بررسي صحت داده ورودي يكي از عمليات مهم در جهت ايمن سازي برنامه هاي وب نيز مي باشد . پس با انگيزه و دقت مضاعف كار را دنبال مي نمائيم .

ضرورت و ماهيت كنترل هاي Validation

زماني كه از يك TextBox براي درج داده بر روي‌ يك فرم استفاده مي گردد ،‌ همواره اين احتمال وجود خواهد داشت كه كاربران اطلاعات را متناسب با انتظار يك برنامه وارد نمايند . به عنوان مثال ،‌ فرض كنيد كه در يك فرم وب از دو TextBox براي درج داده عددي توسط كاربران استفاده شده است و در ادامه مي بايست اطلاعات ورودي در اختيار يك روتين جهت انجام پردازش هاي مورد نياز ( به عنوان نمونه ، انجام عمليات محاسباتي بر روي داده هاي ورودي ) قرار داده شود . در صورتي كه كاربران داده را در محدوده مجاز وارد ننمايند و يا ورودي از نوع عددي نباشد ، روتين مورد نظر در انجام پردازش هاي خود با مشكل مواجه خواهد شد . بنابراين ، مي بايست همواره قبل از اين كه داده ورودي در اختيار روتين هاي مورد نظر جهت انجام پردازش هاي مشخص شده قرار داده شود ، آنها را بررسي و در صورت رعايت مجموعه سياست هاي تعريف شده ، امكان استفاده از آنها را براي اسكريپت ها فراهم نمود .
به منظور ارزيابي داده ورودي توسط كاربران با توجه به داده مورد نياز اسكريپت ها ،‌ از روش هاي متعددي مي توان استفاده نمود . متداولترين نياز ، وجود يك مقدار ورودي است . در چنين مواردي ، انتظار داريم قبل از اين كه يك اسكريپت بتواند پردازش هاي مورد نياز را بر روي داده ورودي انجام دهد، در TextBox مقداري درج شده باشد. ماهيت داده ورودي در اين مقطع مهم نمي باشد و مهم اين است كه داده ئي توسط كاربر در مكان مورد نظر وارد شده باشد . در برخي موارد لازم است كه داده ورودي از يك نوع خاص باشد ( به عنوان نمونه يك مقدار عددي ) تا بتوان آن را در اختيار روتين هاي مورد نظر به منظور انجام پردازش هاي محاسباتي قرار داد . در برخي موارد ديگر ، لازم است كه داده ورودي در يك محدوده خاص باشد و داده درج شده خارج از محدوده مورد نظر ، غيرمعتبر گردد .
براي بررسي و ارزيابي صحت داده در ASP.NET مجموعه اي از كنترل هاي validation ارائه شده است . از كنترل هاي فوق مي توان به منظور بررسي و تست عدم درج داده ، مقايسه داده ورودي با يك مقدار خاص ، بررسي وجود مقادير در يك محدوده خاص و ساير فرم هاي داده استفاده نمود تا اين اطمينان ايجاد گردد كه داده مناسب و معتبر در اختيار اسكريپت ها و به منظور انجام پردازش ها قرار داده مي شود .
كنترل هاي validation در ارتباط مستقيم با كنترل TextBox بوده و تست و ارزيابي خود را بطور اتوماتيك و پس از كليك بر روي كنترل هائي نظير Button ، LinkButton و ImageButton انجام خواهند داد . در صورتي كه ماحصل بررسي يك كنترل validation توام با موفقيت نباشد ، validator يك پيام خطاء را نمايش و به كاربران اعلام مي نمايد كه داده ورودي فاقد شرايط لازم براي استفاده در برنامه مي باشد .
در ادامه به بررسي كنترل هاي فوق خواهيم پرداخت .

كنترل <asp:RequiredFieldValidator>

متداولترين نوع ارزيابي داده ورودي ، بررسي آن به منظور اطمينان از درج داده توسط كاربر است . كنترل <asp:RequiredFieldValidator> ، مسئوليت بررسي داده ورودي در يك Textbox را برعهده گرفته و در صورت عدم درج داده توسط كاربر ، يك پيام خطاء را نمايش خواهد داد . در چنين مواردي ، روتين هائي كه مي بايست پس از كليك بر روي دكمه موجود از داده درج شده در TextBox استفاده نمايند ، فرصت انجام چنين كاري را به دليل عدم درج داده توسط كاربر پيدا نخواهند كرد .

شكل عمومي

شكل عمومي كنترل فوق به صورت زير است :

<asp:RequiredFieldValidatorid="id" Runat="Server"
   ControlToValidate="controlID"
   Display="Dynamic|None|Static"
   ErrorMessage="string"
   SetFocusOnError="False|True"
   ValidationGroup="name"
/>

توضيحات

• از يك id صرفا" زماني استفاده مي شود كه قرار است به كنترل از طريق اسكريپپ مراجعه گردد .
• به خصلت ControlToValidate ، مقدار id كنترل textBox كه مسئوليت بررسي آن به كنترل RequiredFieldValidator واگذار شده است ،‌نسبت داده مي شود.
• خصلت ErrorMessage ، پيام مورد نظر در صورت بروز خطاء را مشخص مي نمايد .
• خصلت SetFocusOnErrorMessage ، يك blinking cursor را در كنترل TextBox مربوطه به منظور تسهيل در امر درج داده جديد قرار مي دهد .
• خصلت ValidationGroup يك گروه از كنترل هاي TextBox را كه مجموعه اي از تست هاي بررسي روي آنها اعمال خواهد شد ، مشخص مي نمايد (در مواردي كه دكمه هاي متفاوت مي توانند باعث فعال شدن تست هاي مختلفي گردند ) .
• خصلت Display : كنترل RequiredFieldValidator ، يك فضاي افقي را متناسب با طول رشته مربوط به پيام خطاء اشغال خواهد كرد . در اغلب موارد ، پيام خطاء در كنار TextBox مربوطه نمايش داده مي شود . مكان فوق بر روي صفحه همواره نشان داده خواهد شد ( ولو اين كه خطائي اتفاق نيافتد ) . در صورتي كه مقدار خصلت Display معادل Dynamic در نظر گرفته شود ، مكاني براي نمايش پيام خطاء رزو نخواهد شد و بطور پويا و همزمان با بروز خطاء ايجاد مي گردد .
مثال
در اين مثال زماني كه كاربر بر روي button كليك نمود ، كنترل RequiredFieldValidator بطور اتوماتيك عمليات بررسي و ارزيابي داده ورودي در TextBox را آغاز مي نمايد ( قبل از اين كه روتين Get_Data فراخوانده شود ) . در صورتي كه TextBox خالي باشد ،‌ يك پيام خطاء نمايش داده شده و cursor مجددا" در TextBox قرار خواهد گرفت . در صورتي كه در TextBox داده ئي توسط كاربر درج گردد ، تست ارزيابي با موفقيت انجام و روتين مربوط فراخوانده شده و مقدار ورودي را در خروجي نمايش خواهد داد . در اين مثال ، مقدار خصلت Display كنترل RequiredFieldValidator ،‌ معادل Dynamic در نظر گرفته شده است ، بنابراين در صورت عدم توليد يك پيام خطاء ، مكاني بر روي صفحه براي نمايش آن در نظر گرفته نخواهد شد . بدين ترتيب به كنترل label اجازه داده مي شود كه در كنار TextBox نمايش داده شده و از فضاي مشابه پيام خطاء استفاده نمايد ( استفاده مشترك از يك مكان بر روي فرم وب به منظور نمايش پيام خطاء و يا داده ورودي توسط كاربر ) .

<SCRIPT Runat="Server">

    Sub Get_Data (Src As Object, Args As EventArgs)
       Output.Text = "You entered '" & MyTextBox.Text & "'"
    End Sub

</SCRIPT>

<form Runat="Server">

<asp:TextBox id="MyTextBox" Runat="Server"/>
<asp:Button Text="Submit" OnClick="Get_Data" Runat="Server"/>
<asp:RequiredFieldValidator Runat="Server"
   ControlToValidate="MyTextBox"
   ErrorMessage="Please enter a data value"
   Display="Dynamic"
   SetFocusOnError="True"/>
<asp:Label id="Output" Runat="Server"/>

</form>

كنترل <asp:RangeValidator>

كنترل فوق مسئوليت بررسي و ارزيابي داده ورودي در يك TextBox را برعهده گرفته و ماموريت آن حصول اطمينان از اين موضوع است كه داده درج شده در محدوده مورد نظر است . اين محدوده توسط دو خصلت MinimumValue و MaximumValue مشخص مي گردد . فرآيند فوق مي تواند در ارتباط با نوع هاي متفاوت داده نظير Date ، اعداد صحيح ، اعداد اعشاري و يا رشته ( مقدار پيش فرض ) اعمال گردد .

شكل عمومي

شكل عمومي كنترل فوق به صورت زير است :

<asp:RangeValidatorid="id" Runat="Server"
   ControlToValidate="controlID"
   Display="Dynamic|None|Static"
   ErrorMessage="string"
   MaximumValue="value"
   MinimumValue="value"
   SetFocusOnError="False|True"
   Type="Currency|Date|Double|Integer|String"
   ValidationGroup="name"
/>

توضيحات

• از يك id صرفا" زماني استفاده مي شود كه قرار است به كنترل از طريق اسكريپپ مراجعه گردد .
• خصلت ErrorMessage ، پيام مورد نظر در صورت بروز خطاء را مشخص مي نمايد .
• خصلت SetFocusOnErrorMessage ، يك blinking cursor را در كنترل TextBox مربوطه به منظور تسهيل در امر درج داده جديد قرار مي دهد .
• خصلت ValidationGroup يك گروه از كنترل هاي TextBox را كه مجموعه اي از تست هاي بررسي روي آنها اعمال خواهد شد ، مشخص مي نمايد (در مواردي كه دكمه هاي متفاوت مي توانند باعث فعال شدن تست هاي مختلفي گردند ) .
• خصلت Display : كنترل RangeValidator ، يك فضاي افقي را متناسب با طول رشته مربوط به پيام خطاء اشغال خواهد كرد . در اغلب موارد ، پيام خطاء در كنار TextBox مربوطه نمايش داده مي شود . مكان فوق بر روي صفحه همواره نشان داده خواهد شد ( ولو اين كه خطائي اتفاق نيافتد ) . در صورتي كه مقدار خصلت Display معادل Dynamic در نظر گرفته شود ، مكاني براي نمايش پيام خطاء رزو نخواهد شد و بطور پويا و همزمان با بروز خطاء ايجاد مي گردد .
• خصلت Type : در صورتي كه نوع داده ورودي مشخص نگردد ،‌ نوع آن به صورت پيش فرض string در نظر گرفته خواهد شد . يك TextBox خالي ، به عنوان يك نوع داده معتبر ارزيابي خواهد شد . بنابراين ، لازم است كه به همراه كنترل RangeValidator از يك كنترل RequiredFieldValidator نيز استفاده گردد تا اين اطمينان حاصل شود كه با عدم درج داده در TextBox مربوطه با آْن به عنوان يك داده معتبر برخورد نخواهد شد .
• خصلت هاي MinimumValue و MaximumValue ، حداقل و حداكثر محدوده مجاز براي داده ورودي را مشخص مي نمايند .
مثال
در اين مثال به منظور ارزيابي و تست داده ورودي در يك TextBox از دو كنترل RangeValidator و RequiredFieldValidator استفاده شده است . بنابراين مي بايست حتما" در TextBox مقداري درج گردد . با توجه به اين كه مقدار خصلت Type معادل integer و مقادير خصلت هاي MinimumValue و MaximumValue به ترتيب صفر و نه در نظر گرفته شده اند ،‌داده ورودي مي بايست عددي بين صفر تا نه باشد .

<SCRIPT Runat="Server">

   Sub Get_Data (Src As Object, Args As EventArgs)
      Output.Text = "You entered '" & MyTextBox.Text & "'"
   End Sub

</SCRIPT>

<form Runat="Server">

Enter a value between 0 and 9:<br/>
<asp:TextBox id="MyTextBox" Runat="Server"/>
<asp:Button Text="Submit" OnClick="Get_Data" Runat="Server"/>
<asp:RangeValidatorRunat="Server"
   ControlToValidate="MyTextBox"
   Type="Integer"
   MinimumValue="0"
   MaximumValue="9"
   ErrorMessage="Please enter an integer in the range 0 to 9"
   Display="Dynamic"
   SetFocusOnError="True"/>
<asp:RequiredFieldValidator Runat="Server"
    ControlToValidate="MyTextBox"
    ErrorMessage="Please enter a data value"
    Display="Dynamic"
    SetFocusOnError="True"/>
<asp:Label id="Output" Runat="Server"/>

</form>

كنترل <asp:CompareValidator>

كنترل فوق مسئوليت بررسي‌ مقدار درج شده در يك TextBox را برعهده دارد . بدين منظور داده ورودي با يك مقدار خاص و يا مقدار يك كنترل موجود بر روي فرم مقايسه مي گردد . نوع داده درج شده در TextBox مي تواند از نوع Currency ، Date ، اعشاري ، صحيح و يا رشته ( مقدار پيش فرض ) باشد .

شكل عمومي

شكل عمومي كنترل فوق به صورت زير است :

<asp:CompareValidatorid="id" Runat="Server"
ControlToCompare="controlID"
ControlToValidate="controlID"
Display="Dynamic|None|Static"
ErrorMessage="string"
Operator="Equal|NotEqual|GreaterThan|GreaterThanEqual|LessThan
                  |LessThanEqual|DataTypeCheck"
SetFocusOnError="False|True"
Type="Currency|Date|Double|Integer|String"
ValidationGroup="name"
ValueToCompare="value"
/>

توضيحات

• از يك id صرفا" زماني استفاده مي شود كه قرار است به كنترل از طريق اسكريپپ مراجعه گردد .
• به خصلت ControlToValidate ، مقدار id كنترل textBox كه مسئوليت بررسي آن به كنترل <asp:CompareValidator> واگذار شده است ،‌نسبت داده مي شود.
• خصلت ErrorMessage ، پيام مورد نظر در صورت بروز خطاء را مشخص مي نمايد .
• خصلت SetFocusOnErrorMessage ، يك blinking cursor را در كنترل TextBox مربوطه به منظور تسهيل در امر درج داده جديد قرار مي دهد .
• خصلت ValidationGroup يك گروه از كنترل هاي TextBox را كه مجموعه اي از تست هاي بررسي روي آنها اعمال خواهد شد ، مشخص مي نمايد (در مواردي كه دكمه هاي متفاوت مي توانند باعث فعال شدن تست هاي مختلفي گردند ) .
• خصلت Display : كنترل <asp:CompareValidator> ، يك فضاي افقي را متناسب با طول رشته مربوط به پيام خطاء اشغال خواهد كرد . در اغلب موارد ، پيام خطاء در كنار TextBox مربوطه نمايش داده مي شود . مكان فوق بر روي صفحه همواره نشان داده خواهد شد ( ولو اين كه خطائي اتفاق نيافتد ) . در صورتي كه مقدار خصلت Display معادل Dynamic در نظر گرفته شود ، مكاني براي نمايش پيام خطاء رزو نخواهد شد و بطور پويا و همزمان با بروز خطاء ايجاد مي گردد .
• مقدار ورودي مي تواند با يك مقدار مشخص شده توسط خصلت ValueToCompare و يا مقدار يك كنترل ديگر موجود در صفحه ( مشخص شده توسط خصلت ControlToCompare ) ، مقايسه گردد . به صورت پيش فرض ، عمليات مقايسه براي "برابري " انجام خواهد شد . در صورت نياز مي توان از ساير عملگرهاي مقايسه اي كه توسط خصلت Operator مشخص مي گردند ، استفاده نمود . عمليات مقايسه بر اساس نوع داده درج شده در Textbox كه توسط خصلت Type مشخص مي گردد ، انجام خواهد شد .
• خصلت Type : در صورتي كه نوع داده ورودي مشخص نگردد ،‌ نوع آن به صورت پيش فرض string در نظر گرفته خواهد شد . يك TextBox خالي ، به عنوان يك نوع داده معتبر ارزيابي خواهد شد . بنابراين ، لازم است كه به همراه كنترل <asp:CompareValidator> از يك كنترل RequiredFieldValidator نيز استفاده گردد تا اين اطمينان حاصل شود كه با عدم درج داده در TextBox مربوطه با آْن به عنوان يك داده معتبر برخورد نخواهد شد .
مثال
در اين مثال ، كاربر مي بايست يك عدد مثبت را وارد نمايد و در صورتي كه مقدار ورودي منفي باشد يك پيام خطاء نمايش داده مي شود . به همراه كنترل CompareValidator از يك كنترل RequiredFieldValidator نيز استفاده شده است تا عدم درج داده ( خالي‌بودن ) به عنوان يك داده معتبر ارزيابي نگردد .
مقدار ورودي مي بايست از نوع اعشاري (Type=Double ) و بزرگتر از (Operator=GreaterThan ) صفر (ValueToCompare=0 ) باشد تا به عنوان يك داده معتبر ارزيابي گردد .

<SCRIPT Runat="Server">

Sub Get_Data (Src As Object, Args As EventArgs)
    Output.Text = "You entered '" & MyTextBox.Text & "'"
End Sub

</SCRIPT>

<form Runat="Server">

 Enter a positive number:<br/>
<asp:TextBox id="MyTextBox" Runat="Server"/>
<asp:Button Text="Submit" OnClick="Get_Data" Runat="Server"/>
<asp:CompareValidatorRunat="Server"
   ControlToValidate="MyTextBox"
   ValueToCompare="0"
   Type="Double"
   Operator="GreaterThan"
   ErrorMessage="Please enter a number greater than 0"
   Display="Dynamic"
   SetFocusOnError="True"/>
<asp:RequiredFieldValidator Runat="Server"
   ControlToValidate="MyTextBox"
   ErrorMessage="Please enter a data value"
   Display="Dynamic"
   SetFocusOnError="True"/>
<asp:Label id="Output" Runat="Server"/>

</form>

كنترل <asp:CustomValidator>

در زمان بررسي و ارزيابي داده ورودي ممكن است به مواردي برخورد نمائيم كه با تركيب يك RequiredFieldValidator ، RangeValidator و يا CompareValidator خواسته ما تامين نگردد. در چنين مواردي مي توان از كنترل <asp:CustomValidator> به منظور انجام تست هاي اضافه استفاده نمود .

شكل عمومي

شكل عمومي كنترل فوق به صورت زير است :

<asp:CustomValidatorid="id" Runat="Server"
ControlToValidate="controlID"
Display="Dynamic|None|Static"
ErrorMessage="string"
SetFocusOnError="False|True"
ValidationGroup="name"
OnServerValidate="subprogram"
/>

توضيحات

• خصلت هاي كنترل <asp:CustomValidator> مشابه ساير كنترل هاي validation مي باشند با اين تفاوت كه از خصلت OnServerValidate به منظور فراخواني يك برنامه فرعي براي بررسي و ارزيابي داده ورودي نيز استفاده مي گردد .
• يك TextBox خالي به عنوان يك داده معتبر در نظر گرفته خواهد شد . بنابراين مي بايست به همراه كنترل CustomValidator از يك كنترل RequiredFieldValidator نيز استفاده گردد تا عدم درج داده به عنوان يك داده معتبر ارزيابي نگردد .
• برنامه فرعي صدا زده شده داراي آرگومان هاي خاص ServerValidateArgs مي باشد . در صورتي كه بررسي و ارزيابي صحت داده ورودي توام با موفقيت نباشد ، مقدار خصلت IsValid معادل false خواهد شد . از آرگومان Value ، به عنوان مرجعي به منظور مراجعه به مقدار TextBox ( كنترل مشخص شده توسط خصلت ControlToValidate ) استفاده مي گردد .
• خصلت ErrorMessage ، پيام مورد نظر در صورت بروز خطاء را مشخص مي نمايد .
• خصلت SetFocusOnErrorMessage ، يك blinking cursor را در كنترل TextBox مربوطه به منظور تسهيل در امر درج داده جديد قرار مي دهد .
• خصلت ValidationGroup يك گروه از كنترل هاي TextBox را كه مجموعه اي از تست هاي بررسي روي آنها اعمال خواهد شد ، مشخص مي نمايد (در مواردي كه دكمه هاي متفاوت مي توانند باعث فعال شدن تست هاي مختلفي گردند ) .
• خصلت Display : كنترل <asp:CustomValidator> ، يك فضاي افقي را متناسب با طول رشته مربوط به پيام خطاء اشغال خواهد كرد . در اغلب موارد ، پيام خطاء در كنار TextBox مربوطه نمايش داده مي شود . مكان فوق بر روي صفحه همواره نشان داده خواهد شد ( ولو اين كه خطائي اتفاق نيافتد ) . در صورتي كه مقدار خصلت Display معادل Dynamic در نظر گرفته شود ، مكاني براي نمايش پيام خطاء رزو نخواهد شد و بطور پويا و همزمان با بروز خطاء ايجاد مي گردد .
مثال
در اين مثال به منظور ارزيابي و تست داده ورودي در يك TextBox از دو كنترل CustomValidator و RequiredFieldValidator استفاده شده است . داده ورودي مي بايست يك عدد صحيح بين صفر تا نود و نه باشد .
پس از كليك بر روي دكمه Submit ، روتين Get_Data فعال و قبل از هر چيز عمليات بررسي و ارزيابي صحت داده ورودي انجام خواهد شد . كنترل RequiredFieldValidator در ابتدا بررسي لازم در خصوص درج داده در TextBox را انجام و در ادامه روتين Validate_TextBox توسط خصلت OnServerValidate كنترل CustomValidator فراخوانده مي شود . روتين فوق ، تست هاي لازم را بر روي داده ورودي انجام خواهد داد ( براي مراجعه به داده ورودي از Args.Value استفاده شده است ) . در صورتي كه هر يك از تست هاي انجام شده توام با موفقيت نباشد ، خصلت Args.Isvalid مقدار false را خواهد گرفت ( داده ورودي مي بايست يك عدد مثبت بين صفر تا نود و نه باشد ) .
پس از انجام فرآيند بررسي داده ورودي ، روتين Get_Data ، اجرا خواهد شد . روتين فوق در ابتدا و پس از كليك بر روي دكمه button فراخوانده مي گردد و اجراي آن تا زماني كه عمليات بررسي و ارزيابي داده ورودي به اتمام نرسيده باشد ، به تاخير خواهد افتاد . پردازش هاي انجام شده در روتين Get_Data مشروط به انجام موفقيت آميز تست ارزيابي و صحت داده است . بنابراين ، همه چيز وابسته به شرط Page.IsValid شده است و در صورتي كه Args.IsValid معادل false شده باشد ، مقدار Page.IsValid نيز false خواهد شد.

<SCRIPT Runat="Server">

 Sub Validate_TextBox (Src As Object, Args As ServerValidateEventArgs)

  If Not IsNumeric(Args.Value) Then
      MyValidator.ErrorMessage = "Please enter a number"
      Args.IsValid = False
    Else
    If Not Args.Value Mod 1 = 0 Then
       MyValidator.ErrorMessage = "Please enter an integer"
       Args.IsValid = False
   End If
   If Args.Value < 0 Then
      MyValidator.ErrorMessage = "Please enter a positive integer"
      Args.IsValid = False
   End If
   If Args.Value > 99 Then
     MyValidator.ErrorMessage = "Please enter a positive integer between 0 and 99"
     Args.IsValid = False
   End If
 End If

End Sub

Sub Get_Data(Src As Object, Args As EventArgs)

If Page.IsValid Then
   Output.Text = "You entered '" & MyTextBox.Text & "'"
End If

End Sub

</SCRIPT>

<form Runat="Server">

Enter a positive integer:<br/>
<asp:TextBox id="MyTextBox" Runat="Server"/>
<asp:Button Text="Submit" OnClick="Get_Data" Runat="Server"/>
<asp:CustomValidator id="MyValidator" Runat="Server"
   ControlToValidate="MyTextBox"
   Display="Dynamic"
   SetFocusOnError="True"
   OnServerValidate="Validate_TextBox"/>
<asp:RequiredFieldValidator Runat="Server"
   ControlToValidate="MyTextBox"
   ErrorMessage="Please enter a data value"
   Display="Dynamic"
   SetFocusOnError="True"/>
<asp:Label id="Output" Runat="Server"/>

</form>

گروه هاي validation

در زمان پياده سازي فرم هاي ورود اطلاعات به مواردي برخورد خواهيم كرد كه لازم است از چندين TextBox به منظور دريافت داده ورودي جهت انجام پردازش هاي مورد نياز در يك اسكريپت ، استفاده گردد .همچنين ، ممكن است در مواردي لازم باشد كه از چندين button در يك فرم ورود اطلاعات استفاده گردد و متناسب با اين كه كدام button توسط كاربران فعال شده است ، بررسي و صحت داده ورودي تعداد خاصي از كنترل هاي موجود بر روي فرم ورود اطلاعات ( مستقل از ساير كنترل ها ) ، انجام شود . در چنين مواردي مي بايست تمامي كنترل هائي را كه مي خواهيم پس از كليك بر روي يك button خاص ، validate شوند را عضوء يك گروه نمود و نام آن گروه را براي button مورد نظر نيز مشخص نمود . بدين ترتيب ، پس از كليك بر روي button مورد نظر صرفا" آندسته از كنترل هائي كه عضوء گروه هم نام با گروه معرفي شده به همراه button مي باشند ، بررسي و ارزيابي خواهند شد .
مثال
در فرم ورود اطلاعات زير از چندين كنترل ( چهار كنترل TextBox ) استفاده شده است كه تمامي آنها عضوء يك گروه validation مي باشند . پس از كليك بر روي دكمه "ارسال اطلاعات " ، صرفا" آندسته از كنترل هائي كه كنترل هاي validation آنها عضوء گروه مشخص شده مي باشند ، validate خواهند شد .
فرم ورود اطلاعات : استفاده از چهار كنترل TextBox كه تمامي آنها عضوء يك گروه Validation مي باشند

<SCRIPT Runat="Server">

Sub Validate_Email (Src As Object, Args As ServerValidateEventArgs)

  If InStr(Args.Value, "@") = 0 Then
      EmailValidator.ErrorMessage = "لطفا يك آدرس پست الكترونيكي صحيح را واردنمائيد"
      Args.IsValid = False
  End If

End Sub

Sub Get_Data (Src As Object, Args As EventArgs)

  If Page.IsValid Then
     Output.Text = "You entered valid data"
  End If

End Sub

</SCRIPT>

<form Runat="Server">

<h3>فرم ورو اطلاعات</h3>

<table border="0" cellpadding="2">
<tr>
<td>نام:</td>
<td><asp:TextBox id="FirstName" Runat="Server"/></td>
<td><asp:RequiredFieldValidator Runat="Server"
        ControlToValidate="FirstName"
        ValidationGroup="Group1"
        ErrorMessage="لطفا  نام خود را واردنمائيد"
        Display="Dynamic"/></td>
</tr>
<tr>
<td>نامخانوادگي:</td>
<td><asp:TextBox id="LastName" Runat="Server"/></td>
<td><asp:RequiredFieldValidator Runat="Server"
         ControlToValidate="LastName"
         ValidationGroup="Group1"
         ErrorMessage="لطفا  نام خانوادگيخود را وارد نمائيد"
         Display="Dynamic"/></td>
</tr>
<tr>
<td>سن:</td>
<td><asp:TextBox id="Age" Width="50" Runat="Server"/></td>
<td><asp:RangeValidator Runat="Server"
         ControlToValidate="Age"
         ValidationGroup="Group1"
         Type="Integer"
          MinimumValue="15"
          MaximumValue="99"
          ErrorMessage="لطفا" يك عدد بين پانزده تا نود و نه را وارد نمائيد"
          Display="Dynamic"/>
<asp:RequiredFieldValidator Runat="Server"
        ControlToValidate="Age"
        ValidationGroup="Group1"
        ErrorMessage="لطفا  سن خود را واردنمائيد  "
        Display="Dynamic"/></td>
</tr>
<tr>
<td>آدرسپست الكترونيكي:</td>
<td><asp:TextBox id="Email" Runat="Server"/></td>
<td><asp:CustomValidator id="EmailValidator" Runat="Server"
         ControlToValidate="Email"
         ValidationGroup="Group1"
         Display="Dynamic"
         OnServerValidate="Validate_Email"/>
<asp:RequiredFieldValidator Runat="Server"
        ControlToValidate="Email"
        ValidationGroup="Group1"
         ErrorMessage="لطفا  آدرس پستالكترونيكي خود را وارد نمائيد"
         Display="Dynamic"/></td>
</tr>
</table>
<br/>
<asp:Button Text="ارسال اطلاعاتValidationGroup="Group1"
        OnClick="Get_Data" Runat="Server"/>
<asp:Label id="Output" Runat="Server"/><br/>

</form>

به دكمه "ارسال اطلاعات " ، يك نام گروه validation نسبت داده شده است تا پس از كليك بر روي آن ، كنترل هائي كه كنترل هاي validation آنها عضوء گروهي با همين نام مي باشند ، بررسي و ارزيابي گردند . در صورتي كه از كنترل هاي validation ديگر بر روي فرم استفاده شده است كه عضوء گروه validation نمي باشند ، پس از كليك بر روي دكمه "ارسال اطلاعات " ، ارزيابي نخواهند شد .
پس از كليك بر روي هر button موجود بر روي يك فرم ، صرفا" آندسته از كنترل هائي بررسي و ارزيابي خواهند شد كه تشكيل يك گروه را مي دهند و از يك نام مشابه براي گروه استفاده مي نمايند كه همانند نام نسبت داده شده به button مورد نظر است .

كنترل <asp:ValidationSummary>

با استفاده از كنترل <asp:ValidationSummary> ، پيام هاي خطاء جداگانه توسط يك كنترل توليد و با يكديگر نمايش داده مي شوند. كنترل فوق ، همچنين قادر به توليد گزارش پيام هاي خطاء محدود به مجموعه اي خاص از كنترل ها مي باشد .

شكل عمومي

شكل عمومي كنترل فوق به صورت زير است :

 

<asp:ValidationSummaryid="id" Runat="Server"
DisplayMode="BulletList|List|SingleParagraph"
HeaderText="string"
ShowMessageBox="False|True"
ShowSummary="False|True"
ValidationGroup="name"
/>

توضيحات

• خصلت DisplayMode ، نحوه ( فرمت ) نمايش پيام هاي خطاء را مشخص مي نمايد كه به صورت پيش فرض يك ليست bulleted در نظر گرفته مي شود .
• مكان نمايش گزارش پيام هاي خطاء در محلي است كه كنترل ValidatiomSummary استفاده شده است .
• با استفاده از خصلت ShowMessageBox و نسبت دادن مقدار True به آن ، يك پيام pop-up نمايش داده خواهد شد . بدين ترتيب ، خروجي كنترل ValidationSummary در يك PoP-Up نمايش داده مي شود .
• در صورتي كه خلاصه گزارش خطاء مرتبط با يك گروه validation خاص مي باشد ، مي بايست نام آن گروه به خصلت ValidationGroup نسبت داده شود .
مثال
مثال زير ، بازنويسي مثال قبل است . با اين تفاوت كه در مقابل نمايش جداگانه پيام هاي خطاء ، از يك كنترل ValidationSummary استفاده شده است .

استفاده از كنترل ValidationSummary

<SCRIPT Runat="Server">

Sub Validate_Email (Src As Object, Args As ServerValidateEventArgs)

  If InStr(Args.Value, "@") = 0 Then
      EmailValidator.ErrorMessage = "لطفا يك آدرس پست الكترونيكي صحيح را وارد نمائيد"
      Args.IsValid = False
  End If

End Sub

Sub Get_Data (Src As Object, Args As EventArgs)

 If Page.IsValid Then
      Output.Text = "You entered valid data"
 End If

End Sub

</SCRIPT>

<form Runat="Server">

<h3>فرم ورو اطلاعات</h3>

<table border="0" cellpadding="2">
<tr>
<td>نام:</td>
<td><asp:TextBox id="FirstName" Runat="Server"/></td>
<td><asp:RequiredFieldValidator Runat="Server"
        ControlToValidate="FirstName"
        ValidationGroup="Group1"
        ErrorMessage=" نام"
        Display="None"/></td>
</tr>
<tr>
<td>نامخانوادگي:</td>
<td><asp:TextBox id="LastName" Runat="Server"/></td>
<td><asp:RequiredFieldValidator Runat="Server"
         ControlToValidate="LastName"
         ValidationGroup="Group1"
         ErrorMessage=" نام خانوادگي"
       Display="None"/></td>
</tr>
<tr>
<td>سن:</td>
<td><asp:TextBox id="Age" Width="50" Runat="Server"/></td>
<td><asp:RangeValidator Runat="Server"
         ControlToValidate="Age"
         ValidationGroup="Group1"
         Type="Integer"
          MinimumValue="15"
          MaximumValue="99"
          ErrorMessage="يكعدد بين پانزده تا نود و نه  "
        Display="None"/>
<asp:RequiredFieldValidator Runat="Server"
        ControlToValidate="Age"
        ValidationGroup="Group1"
        ErrorMessage=" سن   "
      Display="None"/></td>
</tr>
<tr>
<td>آدرس پستالكترونيكي:</td>
<td><asp:TextBox id="Email" Runat="Server"/></td>
<td><asp:CustomValidator id="EmailValidator" Runat="Server"
         ControlToValidate="Email"
         ValidationGroup="Group1"
         Display="None"/>
         OnServerValidate="Validate_Email"/>
<asp:RequiredFieldValidator Runat="Server"
        ControlToValidate="Email"
        ValidationGroup="Group1"
         ErrorMessage="  آدرس پست الكترونيكي  "
        Display="None"/></td>
</tr>
</table>
<br/>
<asp:Button Text="Submit" ValidationGroup="Group1"
         OnClick="Get_Data" Runat="Server"/>
<asp:Label id="Output" Runat="Server"/><br/>

<asp:ValidationSummary Runat="Server"
     ValidationGroup=
"Group1"
     DisplayMode=
"BulletList"
     HeaderText=
" لطفا اطلاعات زير را وارد نمائيد"
     ShowSummary=
"True"
     ShowMessageBox=
"False"/>

</form>

تهديدات امنيتي در صورت عدم ارزيابي داده ورودي

برنامه هاي وب ، داده مورد نياز خود را از طريق درخواست هاي مبتني بر پروتكل HTTP دريافت مي نمايند ( در برخي موارد ممكن است داده مورد نياز يك برنامه وب از طريق يك فايل تامين گردد). با توجه به ماهيت پروتكل فوق ، مهاجمان مي توانند هر بخشي از يك درخواست HTTP نظير url ، querystring ، هدر ، كوكي ها ، فيلدهاي موجود بر روي فرم و فيلدهاي مخفي را تحريف تا ضمن ناديده گرفتن مكانيزم هاي امنيتي بكارگرفته شده در يك سايت ، آن را با مشكلات امنتيي متعددي مواجه نمايند. حملات forced browsing, command insertion, cross site scripting, buffer overflows, format string attacks و SQL injection نمونه هائي در اين زمينه مي باشند .
تعداد زيادي از برنامه هاي وب صرفا" از مكانيزم هاي سمت سرويس گيرنده به منظور بررسي و ارزيابي داده ورودي استفاده مي نمايند . مهاجمان با استفاده از روش هاي متفاوتي مي توانند مكانيزم هاي استفاده شده به منظور ارزيابي داده ورودي را ناديده گرفته و برنامه هاي وب را در مقابل داده ورودي مخرب خلع سلاح نمايند . مهاجمان ، بدين منظور مي توانند با استفاده از ابزارهائي نظير telnet درخواست هاي HTTP را توليد نمايند . بديهي است در چنين مواردي نبايد انتظار داشت آنان واكنش هائي را كه مد نظر پياده كنندگان برنامه هاي وب در سمت سرويس گيرنده است ،‌ انجام دهند . با اين كه بررسي و ارزيابي داده ورودي در سمت سرويس گيرنده يك ايده عالي است و مي تواند به عنوان يك اقدام مناسب در جهت افزايش كارآئي برنامه هاي وب تلقي گردد ولي قطعا" رويكرد فوق داراي مزيت امنيتي خاصي نخواهد بود .
به منظور ارزيابي داده ورودي مي بايست از روش هاي سمت سرويس دهنده استفاده گردد تا يك لايه دفاعي مناسب به منظور پيشگيري از درج داده مخرب توسط مهاجمان ايجاد گردد . پس از تحقق خواسته فوق ، مي توان با دقت اقدام به بهينه سازي روش هاي استفاده شده به منظور بررسي و ارزيابي داده ورودي در سمت سرويس گيرنده نيز نمود تا ترافيك غيرضروري بر روي سرويس دهنده به حداقل مقدار ممكن برسد .

بررسي يك نمونه

در برخي موارد از داده ورودي در يك TextBox به منظور ايجاد يك query در ارتباط با يك بانك اطلاعاتي استفاده مي گردد . روش فوق ، ممكن است مسائل و مشكلات امنيتي متعددي را به دنبال داشته باشد ( از عدم اجراي اسكريپت ها گرفته تا بروز اشكال در بانك اطلاعاتي ) . مجددا" لازم است به اين نكته مهم اشاره گردد كه كنترل هاي validation ، به منزله اولين لايه دفاعي در مقابل درج داده مخرب محسوب مي گردند و اين اطمينان را ايجاد مي نمايند كه صرفا" داده معتبر در اختيار ساير لايه هاي يك برنامه خصوصا" لايه داده آن قرار داده خواهد شد .
مهاجمان مي توانند از طريق TextBox استفاده شده بر روي يك فرم ،‌ كدهاي مخربي را به سيستم وارد نمايند كه حذف تمامي بانك اطلاعاتي را به دنبال داشته باشد . با اين كه همواره فرض پياده كنندگان برنامه هاي وب بر اين است كه از TextBox براي درج داده در سيستم استفاده خواهد شد ، ولي واقعيت اين است كه ممكن است از آنها براي درج كد نيز استفاده گردد . SQL injection يك نمونه از تهديدات موجود در اين زمينه است .

SQL Injection

فرض كنيد از يك TextBox براي درج داده بر روي يك فرم استفاده شده باشد و پس از درج داده توسط كاربر ، از آن به منظور بازيابي ركوردهائي خاص از يك بانك اطلاعاتي استفاده مي گردد . بدين منظور ، از دستور SELECT به صورت زير استفاده شده است :

 SQLString = "SELECT * FROM MyTable WHERE MyKey = '" & MyTextBox.Text & "'"

دستور SELECT ، به صورت پويا از مقدار درج شده در TextBox استفاده مي نمايد . ظاهرا" همه چيز درست است و مشكل خاصي وجود نخواهد داشت ولي فرض كنيد كاربري كد SQL زير را در TextBox وارد نمايد :
پس از درج داده فوق در TextBox ، وضعيت query نوشته شده در برنامه به صورت زير خواهد بود :

 SELECT * FROM MyTable WHERE MyKey = ' ' ; DROP DATABASE MyDatabase

در چنين مواردي ، عبارت SQL شامل دو دستور مجزاء مي گردد كه اولين دستور آن با توجه به ماهيت داده ورودي مقدار null خواهد بود و عملا" ركوردي را برنمي گرداند و دومين عبارت SQL ، باعث حذف يك بانك اطلاعاتي خواهد شد . بدين ترتيب يك SQL injection محقق مي گردد و كد مخرب با داده مورد انتظار در عبارت SQL جايگزين مي شود. با اين كه در يك بانك اطلاعاتي اكسس ، نمي توان چندين عبارت SQL را در يك خط استفاده نمود ولي برخي از سيستم هاي مديريت بانك هاي اطلاعاتي قادر به اجراء كد فوق خواهند بود .
پياده كنندگان برنامه هاي وب مي توانند از كنترل هاي validation به منظور بلاك نمودن اينچنين كدهائي استفاده نمايند . بدين منظور مي توان طول رشته ورودي ، نوع داده ورودي و يا وجود داده ورودي در يك محدوده خاص را بررسي نمود . تست هاي فوق در مواردي كه داده ورودي از نوع string و با طول نامشخص باشند ، كارساز نبوده و نمي توان از كنترل هاي اشاره شده در جهت ايجاد يك سطح حفاظتي مناسب استفاده نمود .

راه حل چيست ؟

بهترين روش براي حفاظت در مقابل ورود كدهاي مخرب به سيستم ، استفاده از عبارات SQL به صورت پارامتريك در مقابل بكارگيري مستقيم داده ورودي است . پارامترها ، مكان لازم براي نگهداري مقادير داده را فراهم نموده و اين اطمينان را ايجاد مي نمايند كه از مقادير ورودي مستقيما" در كد استفاده نخواهد شد .
در كد زير از يك عبارت SELECT به منظور بازيابي ركوردهائي خاص از جدول Books در بانك اطلاعاتي BooksDB استفاده شده است . عبارت SQL به عنوان خصلت SelectCommand كنترل منبع داده AccessDataSource ( با " id="BookSource ) در نظر گرفته شده است .

 Sub Get_Record (Src As Object, Args As EventArgs)

  Dim SQLString As String
  SQLString = "SELECT BookID, BookTitle, BookPrice FROM Books" & _
                     "WHERE BookID = @BookID"
  BookSource.SelectCommand = SQLString

End Sub

يك پارامتر با استفاده از نام خود كه به دنبال يك كاراكتر "@" مي آيد ( در اين مثال BookID @ ) ، مشخص مي گردد و يك مرجع به داده ورودي است كه در عبارت SELECT و به منظور بازيابي ركوردهاي مورد نظر استفاده مي گردد . فرض كنيد ، كاربر داده زير را در TextBox وارد نمايد :

Add Comments
Name:
Email:
User Comments:
SecurityCode: Captcha ImageChange Image