جلوگیری از حملات sql injection در asp.net – قسمت اول

تاریخ انتشار : آذر ۲۷, ۱۳۹۷
1 ستاره2 ستاره3 ستاره4 ستاره5 ستاره

در این بخش با مقاله ای با موضوع جلوگیری از حملات sql injection در asp.net در خدمت شما عزیزان خواهیم بود.

این مقاله ترجمه یکی از مقالات سایت Mikesdotnetting می باشد. در این مقاله سعی شده حملات sql injection بررسی شود و راه های مقابله با آن نیز آموزش داده شوند.

حملات sql injection چیست؟

برای پاسخ لطفا به قطعه کد زیر که در میلیون ھا وبسایت استفاده شده و برای شناسایی کاربرانی می باشد که میخواھند به قسمت ھای محافظت شده سایت دسترسی داشته باشند، توجه کنید :

protected void Button1_Click(object sender, EventArgs e)
{
string connect = “MyConnString”;
string query = “Select Count(*) From Users Where Username = ‘” + UserName.Text + “‘ And Password =
‘” + Password.Text + “‘”;
int result = 0;
using (var conn = new SqlConnection(connect))
{
using (var cmd = new SqlCommand(query, conn))
{
conn.Open();
result = (int)cmd.ExecuteScalar();
}
}
if (result > 0)
{
Response.Redirect(“LoggedIn.aspx”);
}
else
{
Literal1.Text = “Invalid credentials”;

این قطعه کد بصورت معمول در رویداد کلیک روی دکمه لاگین اجرا میشود. این کد به دیتابیس وصل شده و کدی را روی سرور sql  اجرا می کند که جواب بازگشتی آن با شرط برابر بودن نام کاربری و رمز عبور باز میگردد که در مرحله اول نام کاربری با جدول خود در دیتابیس چک میشود. اگر جواب حداقل دارای یک ردیف دیتا باشد کاربر وارد سیستم می شود. در زمان اجرا مقادیر ورودی کاربر به متن موجود اضافه شده تا یک query قابل اجرا روی سرور sql درست شود.

در تصویر مقادیر داده شده admin بعنوان نام  کاربری و Let_Me_In بعنوان رمز عبور می باشد. همانطور که در تصویر مشاهده می کنید ترکیب مقادیر ورودی و متن اولیه بعنوان query به خوبی کار می کنند. شما فقط زمانی اجازه ورود پیدا می کنید که مقادیر ورودی تان با مقادیر دیتابیس برابر باشد. حال به تصویر زیر نگاه کنید :

براحتی می توان مقدار or ‘1’=’1′ را بعنوان نام کاربری وارد کرد اگر شما در رابطه با sql  اطلاع کافی داشته باشید متوجه می شوید که در اثر ترکیب مقادیر ورودی متن اولیه suery بوجود می آید که همیشه حداقل یک جواب دارد.

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

به این عمل sql injection می گویند. در وایع دستور های دیگر sql به دستور اولیه برای تغییر رفتار ان تزریق می شوند. (‘) باعث پیچیدگی دستورات می شود و اگر شما به کاربر اجازه دهسد آن را وارد کند بدون آن که آن را چک کنید، شما خود به خود به دنبال دردسر می گردید. بصورت معمول افراد متوسط به تازه کارها پیشنهاد می کنند (‘) با ( ; ) توسط متد “string.Replace()” تعویض کنند مانند زیر :

و در حقیقت به نتیجه دلخواه خود میرسند!!

اولین عبارت or هیچ گاه جوابی برنمیگرداند پس به نتیجه رسیدیم. اما این کد در برابر انواع دیگر روش های حمله ایمن نیست.

دقت کنید گاهی اوقات که شما article یا product یا چیزهای دیگر را براساس ID آنها search می کنید و این ID ها اغلب به صورت اتوماتیک ساخته می شوند کد شما شبیه این خواهد بود :

string connect = “MyConnString”;
string query = “Select * From Products Where ProductID = ” + Request[“ID”];
using (var conn = new SqlConnection(connect))
{
using (var cmd = new SqlCommand(query, conn))
{
conn.Open();
//Process results
}
}

 

پایان قسمت اول


نظرات

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *