0

جلوگیری از حملات SQL Injection در ASP.NET

 
mohamadaminsh
mohamadaminsh
کاربر طلایی1
تاریخ عضویت : دی 1389 
تعداد پست ها : 25772
محل سکونت : خوزستان

جلوگیری از حملات SQL Injection در ASP.NET

جلوگیری از حملات SQL Injection در ASP.NET



در این مقاله فرض شده است که خواننده با اصول اولیه زبان پرس و جوی ساخت یافته (Structured Query Language) یا همان SQL آشنا است. در ضمن کدهای موجود در این مقاله تماما به زبان VB.NET می باشند
یک حمله SQL Injection چیست؟
حتما در فیلمهای سینمایی دیده اید که بسیاری از تبهکاران قربانیان خود را با تزریق مواد سمی به جای دارو از میان بر می دارند. آیا در دنیای سایبر نیز چنین ایده هایی وجود دارد؟ در کمال تعجب باید بگویم که بله!! هکرها هم به نوعی از این شگرد استفاده می کنند. می گویید چگونه؟ با تزریق کردن دستورات SQL مورد علاقه خود به Application شما! اجازه دهید تا با یک مثال مطلب را روشن تر کنم:
سیستم Login:
صفحات Login معمولا دارای فیلدهایی هستند که دو مقدار ID و Password را از کاربر گرفته و سپس با استفاده از یک دستور SQL آن را پردازش می کنند. نمونه ساده ای از این دستور به صورت زیر است:
SELECT COUNT(UserID) FROM tblUsers WHERE UserID=’” & UserID.Text & “‘ AND Pass=’” & Password.Text & “‘”
در این مثال UserID و Password دو کنترل TextBox هستند که مقادیر آنها بایستی مورد پردازش قرار گیرد. حال فرض می کنیم کاربر مقادیر را به صورت mahdi و ۱۲۳ وارد نماید، در این صورت جمله SQL به صورت زیر تولید می شود:
SELECT COUNT(UserID) FROM tblUsers WHERE UserID=’mahdi’ AND Pass=’123′
خوب تا اینحا مشکلی وجود ندارد. حال فرض کنید که هکر ما به جای کلمه کاربری خود عبارت زیر را وارد نماید:
‘ OR 1=1 –
در این صورت عبارت SQL زیر تولید خواهد شد:
SELECT COUNT(UserID) FROM tblUsers WHERE UserID=” OR 1=1 – AND PASS=”
احتمالا می دانید که کاراکتر – در SQL علامت توضیحات است و عبارت پس از آن دیگر پردازش نمی شود لذا هنگام پردازش دستور چون همواره ۱=۱ است و با توجه به OR به کار رفته، بدون توجه به خالی بودن مقدار مقابل UserID 1=1 کافی تلقی شده و کلیه رکوردهای بانک اطلاعاتی برگردانده می شود و Attacker اصطلاحا Authenticate می شود.
پیش از آنکه به ارائه راه حل این حفره امنیتی خودساخته بپردازیم این نکه شایان ذکر است که این حملات در پایگاه اطلاعاتی SQL Server بسیار پیچیده تر است
چاره کار!
ساختار شی گرای ASP.NET و امکانات این ساختار به برنامه نویسان امکان مانور بیشتری را داده است. حال ما کد کامل اصلاح شده را در زیر آورده و سپس توضیحات آن را ذکر می کنیم:
Dim strSQL As String = "SELECT COUNT(UserID) FROM tblUsers WHERE
UserID=@UserID AND Password=@Password"
Dim cmndCheck As OleDbCommand = New OleDbCommand(strSQL, _Connection)
cmndCheck.Parameters.Add("@UserID", UserID.Text);
cmndCheck.Parameters.Add("@Password", Password.Text);
cmndCheck.Connection.Open()
Dim IsValid As Integer = cmndCheck.ExecuteScalar()
If IsValid > 0
    '... Some Code here... User is authenticated
Else
    '... Some Code here... User is not aututorized to view the page
End If
تغییر در همان خط اول یعنی دستور SQL مشخص است این بار به جای اینکه مقادیر دریافتی از فیلدها با Single Quote به خورد پردازشگر دستور داده شود مقادیر با پارامترهای تولید شده توسط آبجکت OleDbCommand جایگزین می شود و در آخر cmndCheck پردازش شده چنانچه مقدار تولید شده توسط ExecuteScalar بزرگتر از صفر باشد بدین معنی است که حداقل یک رکورد با شرایط مورد نظر ما پیدا شده است. (متغیر Connection_ که باید برابر ConnectionString شما قرار گیرد دانسته فرض شده است)
تقاوت اصلی این روش نسبت به روش ناامن قبلی این است که در اینجا مقادیر به صورت کاملا” پارامتری شده پردازش می شوند نه به صورت قطعاتی از یک رشته حرفی که در واقع دام اصلی SQL Injection به شمار می آید. در واقع ما در اینجا از تکنیکهای رشته سازی با استفاده از & یا + اجتناب کرده ایم.
نکته مهم دیگری که باید حتما مورد توجه قرار دهید این است که یکی از راههایی که هکرها برای حمله به سایت شما استفاده می کنند خطاسازی صوری در زمان اجرای Application و مطالعه اطلاعات خطای دریافت شده است. برای جلوگیری از این اتفاق که می تواند ساختار بعضی از قسمتهای کد شما را برای حمله کنندگان آشکار کند حتما در Application خود از روال خطایابی Customize شده استفاده کنید. علاوه بر این می توانید در بسیاری از قسمتها به صورت موردی از Try…End Try استفاده کنید و برای اطلاع خودتان از خطای رخ داده e As OleDbException را به آدرس Email خود ارسال کنید که در این مورد در فرصتی دیگر صحبت خواهم کرد.

کریمی که جهان پاینده دارد               تواند حجتی را زنده دارد

 

دانلود پروژه و کارآموزی و کارافرینی

چهارشنبه 24 خرداد 1391  6:30 PM
تشکرات از این پست
دسترسی سریع به انجمن ها