golo giry az hamlat sql
صفحه 1 از 1
golo giry az hamlat sql
جلوگیری از حملات SQL Injection در ASP.NET
در قسمت اول این مقاله به توضیح SQL Injection و نحوه مقابله با آن در ASP.NET و در پایگاه داده Access پرداخته می شود.
در این مقاله فرض شده است که خواننده با اصول اولیه زبان پرس و جوی ساخت یافته (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 و 123 وارد نماید، در این صورت جمله 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 علامت توضیحات است و عبارت پس از آن دیگر پردازش نمی شود لذا هنگام پردازش دستور چون همواره 1=1 است و با توجه به 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 خود ارسال کنید که در این مورد در فرصتی دیگر صحبت خواهم کرد.
این مثال و راه حل یکی از ساده ترین انواع حملات Injection روی Web Applicationهاست و شما می توانید نمونه ها و مثالهای متعددی در این خصوص را در سایتهای www.sqlsecurity.com و www.nextgenss.com پیدا کنید که چنانچه گفته شد (و در قسمت دوم این مقاله بدان پرداخته خواهد شد) بیشتر مربوط به SQL Server است. روش کلی کار در SQL Server نیز کمابیش مشابه همین روش است با این تفاوت که در آنجا از Stored Procedure استفاده می شود. پس منتظر قسمت دوم این مقاله و تکنیکهای پیشرفته تر Hackerها در نفوذ به بانک اطلاعاتی SQL Server یک برنامه نویس ناشی و روش اجتناب از آن باشید ;-)
در قسمت اول این مقاله به توضیح SQL Injection و نحوه مقابله با آن در ASP.NET و در پایگاه داده Access پرداخته می شود.
در این مقاله فرض شده است که خواننده با اصول اولیه زبان پرس و جوی ساخت یافته (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 و 123 وارد نماید، در این صورت جمله 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 علامت توضیحات است و عبارت پس از آن دیگر پردازش نمی شود لذا هنگام پردازش دستور چون همواره 1=1 است و با توجه به 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 خود ارسال کنید که در این مورد در فرصتی دیگر صحبت خواهم کرد.
این مثال و راه حل یکی از ساده ترین انواع حملات Injection روی Web Applicationهاست و شما می توانید نمونه ها و مثالهای متعددی در این خصوص را در سایتهای www.sqlsecurity.com و www.nextgenss.com پیدا کنید که چنانچه گفته شد (و در قسمت دوم این مقاله بدان پرداخته خواهد شد) بیشتر مربوط به SQL Server است. روش کلی کار در SQL Server نیز کمابیش مشابه همین روش است با این تفاوت که در آنجا از Stored Procedure استفاده می شود. پس منتظر قسمت دوم این مقاله و تکنیکهای پیشرفته تر Hackerها در نفوذ به بانک اطلاعاتی SQL Server یک برنامه نویس ناشی و روش اجتناب از آن باشید ;-)
صفحه 1 از 1
صلاحيات هذا المنتدى:
شما نمي توانيد در اين بخش به موضوعها پاسخ دهيد