عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
كنترل های Validation در ASP.NET ( بخش چهارم ) |
مديريت وب |
12276 |
9 |
3.1 |
با توجه به جایگاه داده در عصر حاضر و لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و خدمات خود را از طریق سایت www.fabak.ir به مخاطبان محترم عرضه می نماید
 |
كنترل های Validation در ASP.NET
كنترل های Validation در ASP.NET
( بخش چهارم )
آنچه تاكنون گفته شده است :
-
بخش اول
: ماهيت و جايگاه كنترل های validation
و بررسی عملكرد كنترل های <asp:RequiredFieldValidator> و
<asp:RangeValidator>
-
بخش دوم
: بررسی عملكرد كنترل های <asp:CompareValidator> و <asp:CustomValidator>
-
بخش سوم :
آشنائی با گروه های validation و بررسی عملكرد كنترل
<asp:ValidationSummary>
در اين بخش به بررسی برخی نكات خاص در خصوص
ايمن سازی برنامه های وب با تمركز بر روی كنترل های
Validation خواهيم پرداخت .
تهديدات امنيتی در صورت عدم
ارزيابی داده ورودی
برنامه های وب ، داده مورد نياز خود را از طريق درخواست های مبتنی بر
پروتكل 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 وارد نمايد :
مقدار ورودی در TextBox ،
به عنوان مقدار پارامتر BookID @
در عبارت SELECT در نظر گرفته می شود .
در چنين مواردی ، می بايست با صراحت مقدار درج شده در TextBox
را با پارامتر فوق مرتبط نمود . زمانی كه از كنترل
AccessDataSource به منظور بازيابی داده از يك بانك اطلاعاتی استفاده می
گردد ، برای مشخص كردن پارامترهای مورد نياز در يك عبارت SELECT
، می بايست از بخش <SelectParameters> در كنترل استفاده گردد . در اين
بخش می توان از يك و يا چندين كنترل <asp:ControlParameter> استفاده نمود . با
استفاده از كنترل <asp:ControlParameter> ، می بايست يك نام
را برای
پارامتر در نظر گرفت .همچنين ، لازم است كنترلی كه قرار است مقدار آن به عنوان
پارامتر در نظر گرفته شود
نيز مشخص گردد.
كد زير نحوه استفاده از پارامتر BookID @
در كنترل AccessDataSource را نشان می دهد
.
Book ID:
<asp:TextBox id="BookIDInput" Runat="Server"/>
<asp:Button Text="Find" OnClick="Get_Record" Runat="Server"/>
<asp:AccessDataSource id="MySource" Runat="Server"
DataFile="../DB/BooksDB.mdb">
<SelectParameters>
<asp:ControlParameter Name="BookID"
ControlID="BookIDInput" PropertyName="Text"/>
</SelectParameters>
</asp:AccessDataSource>
|
توضيحات :
-
كنترل <asp:ControlParameter> از سه خصلت
به منظور ايجاد ارتباط با كنترلی
كه داده مورد نياز را تامين
خواهد كرد ، استفاده می نمايد .
-
خصلت Name ، نام در نظر
گرفته شده برای پارامتر را كه از آن در عبارت SELECT
استفاده خواهد شد را مشخص می نمايد .
-
خصلت
ControlID ، شناسه (id )
كنترلی است كه داده مورد نياز برای پارامتر را مشخص می نمايد .
-
PropertyName ، خصلت كنترلی است كه از مقدار
آن به
عنوان مرجع استفاده
می گردد ( در اين مثال خصلت Text
مربوط به كنترل TextBox ) .
-
در مثال فوق از يك
پارامتر در عبارت SELECT استفاده شده است ، بنابراين
به يك كنترل
<asp:ControlParameter> نياز می باشد. در صورتی
كه لازم است از چندين پارامتر استفاده
شود ، می بايست برای هر يك از آنها از يك
كنترل <asp:ControlParameter> استفاده گردد .
سادگی كد نويسی
با پارامتر درج شده در يك عبارت SELECT به
عنوان يك مقدار داده literal برخورد می شود . بنابراين ، بر خلاف زمانی كه از رشته
های متصل شده به هم به منظور بكارگيری يك عبارت SQL
استفاده می گردد ، احتمال درج داده مخرب بطرز مشهودی كاهش خواهد يافت . استفاده از
پارامتر در عبارات SQL ، كاهش پيچيدگی كدينگ عبارات
SQL را نيز به دنبال خواهد داشت .
كد زير يك نمونه عبارت SQL را نشان می دهد كه
در آن از يك رشته
متصل شده به هم استفاده شده است :
SQLString = "SELECT * FROM Books WHERE " & _
"BookType = '" & TypeTextBox.Text &
"' AND " & _
"BookPrice > " &
PriceTextBox.Text & " AND " & _
"BookQty <= " & QtyTextBox.Text
& " AND " & _
"BookTitle LIKE '%" &
TitleTextBox.Text & "%'"
|
كد فوق را می توان با عبارت زير جايگزين نمود :
SQLString = SELECT * FROM Books WHERE " & _
"BookType = @BookType AND BookPrice >
@BookPrice AND " & _
"BookQty <= @BookQty AND BookTitle
LIKE @BookQty"
|
درون كنترل
AcessDataSource ، می بايست از يك بخش
SelectParameters به منظور معرفی كنترل هائی كه مقدار
مورد نياز هر يك از پارامترها را تامين می نمايند ، استفاده
گردد .
|