شرکت فناوری اطلاعات لاوین
صفحه نخست محصولات تماس با ما
 مقالات 
SQL Injection راهی برای حمله و نفوذ به سایت های اینترنتی
Wikipedia.org ,Barnamenevis.org   ۱۳۹۰/۰۸/۳۰
یکی از راه های حمله و نفوذ به سایت های اینترنتی و دستکاری داده های بانک اطلاعاتی،تزریق کد های مخرب SQL به سایت است. در این روش مهاجم سعی می کند با وارد کردن دستورات sql در سایت به پایگاه داده دسترسی پیدا کرده و اقدام به ویرایش ،حذف و بازیابی داده های مورد نظر خود از بانک اطلاعاتی کند. در این مقاله به چگونگی مقابله با این حمله به صورت اجمالی می پردازیم.

1024x768 Normal 0 false false false EN-US X-NONE AR-SA

SQL Injection  راهی برای حمله  و نفوذ به سایت های اینترنتی

یکی از راه های حمله و نفوذ به سایت های اینترنتی و دستکاری داده های بانک اطلاعاتی،تزریق کد های مخرب SQL به سایت است.

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

در این مقاله به چگونگی مقابله با این حمله به صورت اجمالی می پردازیم.

مثال:

صفحه Login یک سایت را در نظر بگیرید.معمولا برنامه نویسان از عبارات پویا ی SQL برای بررسی صحت وجود کاربر مجاز جهت ورود به سایت استفاده می کنند.

query متداول select برای ورود به سایت :

Select  * from  Users   where  ID =’ “ +username.text+” ‘  And  Password =   ’ “ +password.text+” ‘

این query  بر اساس مقادیری که از دو  textbox   username, password  می گیرد،وجود کاربر را بررسی می کند.

حال اگر کاربر به جای IDو Password (یا حتی فقط ID ) عبارت sara’ or 1=1- -  را وارد کند به راحتی از صفحه Login سایت عبور خواهد کرد.(کلمه sara در اینجا username است.)

Select  * from  Users   where  ID =  ‘sara’ or 1=1- -‘ and  Password = ‘sara’ or 1=1--

از آنجایی که "1=1" همواره برقرار است،بخش شرط دستور خنثی میشود و معادل این query خواهد شد:

Select * from Users

و همان طور که می دانیم در SQL برای بیان توضیحات از"--" استفاده  می شود و با استفاده از این عبارت در اینجا ،قسمت بعدی عبارت SQL نادیده گرفته می شود .

تا اینجای کار ،نفوذ تنها منجر به بازیابی اطلاعات شد.حال به مثال زیر توجه کنید:

Select * from users where ID=1;Drop Table users;

 

این query شامل دو دستور است که با ";" از هم جدا شده اند. دستور دوم باعث حذف جدول users خواهد شد!

 

تزریق کد sql در query string:

 

Query string روش متداولی برای نمایش پویای اطلاعات در سایت ها می باشد.به این لینک توجه کنید:

 

http://www.alfa-web.net/Article.aspx?artID=20

 

با استفاده از این عبارت،محتوای مقاله ای نمایش داده می شود که artID آن برابر 20 است. حال اگر مهاجم عبارت زیر را وارد کند:

http://www.alfa-web.net/Article.aspx?artID=20 or 1=1

عبارت پویای sql به شکل زیر عمل میکند:

Select * from Article where artID=20 or 1=1

 

و نتیجه نمایش همه مقالات جدول Article خواهد بود.

 

 راه های مقابله با Sql Injection :

  حال به بررسی روش های مقابله با حمله های  Sql Injectionمی پردازیم.

·          تعیین نوع داده ای مناسب برای  فیلدهای جداول دیتابیس.

 

به طور مثال اگر محتوای فیلدی تنها عدد می باشد،نوع آن فیلد را int در نظر بگیریم نه string.زیرا در این صورت مهاجم نمیتواند هر ترکیبی از کد های مخرب را برای نفوذ وارد کند.

 

·          اعتبار سنجی و بررسی مقادیر ورودی

 

  در این روش سعی می شود تا از ورود کاراکترهای غیر مجاز مانند "-- ; ‘ =" از سوی کاربر جلوگیری نمود.

 

·          استفاده از پارامترها و پروسیجرهای ذخیره شده

 

  با استفاده از  پروسیجرهای ذخیره شده کاربران نمیتوانند مستقیما به جداول دسترسی داشته باشند و تزریق کدهای sql به سادگی قبل نیست زیرا در این روش پارامترها از نظر نوع ارسال شده و طول مجاز بررسی و می شوند.

 

مثال استفاده از روش پارامتر:

using (SqlCommand myCommand = new SqlCommand("SELECT * FROM USERS WHERE USERNAME=@username AND PASSWORD=HASHBYTES('SHA1',

 @password)", myConnection))

    {                   

        myCommand.Parameters.AddWithValue("@username", user);

        myCommand.Parameters.AddWithValue("@password", pass);

        myConnection.Open();

        SqlDataReader myReader = myCommand.ExecuteReader())

        ...................

    }

·          استفاده از روش String.Format

   در این روش نیز مانند روش پارامتر ورودی از نظر نوع ارسال داده و طول مجاز بررسی می شود.

   مثال استفاده از روش String.Format :

        string news = string.Format("select * from new where _idNews={0}, _titleNews= {1}", txt_id.Text,txt_ title.Text);

        SqlCommand com = new SqlCommand(Q, con);

        SqlDataReader dr = com.ExecuteReader();

        while (dr.Read()

               

·          دادن سطح دسترسی محدود به کاربران،در اجرای دستورات sql

·          تعداد کاراکترهای ورودی کاربر را محدود کنید.

 

  با تعیین حداکثر تعداد کاراکترهای دریافتی می توان میزان سعی و خطا و نفوذ محاجمین را کاهش داد.

 

·          پرهیز از نمایش دادن خطاهای برنامه به کاربر

 

  خطاهای حاصل از دیتا بیس حاوی مشخصاتی از دیتابیس مانند نام جداول ،فیلدها یا نام دیتابیس و... هستند و مهاجمین گاهی با تست کردن ورودی ها،از این خطاها برای نفوذ در بانک اطلاعات استفاده می کنند.

بنابراین بهتر است تا صفحه ای برای نمایش خطا ساخته و در زمان بروز این خطا ها آن صفحه را نمایش دهید.

برای این کار،پس از ساخت صفحه خطا،در فایل web.config مقدار تگ CustomError را با "on" تنظیم کنید تا جزئیات خطاهای پیش بینی نشده نمایش داده نشود.

تگ های زیر را قبل از تگ </configuration> وارد کنید.

 

<system.web>

    <customErrors mode="On" defaultRedirect="ErrorPage.htm"/>

</system.web>

 

 

             منابع:

Wikipedia.org

Barnamenevis.org


 


 ابزار 
نسخه چاپی
ارسال به دوستان ارسال به دوستان
انتقادات و پیشنهادات انتقادات و پیشنهادات
افزودن به آدرس های برگزیده افزودن به آدرس های برگزیده

طراحی سایت و پورتال، هاست و سرور اختصاصی - رادکام
صفحه نخست | تماس با ما | مقالات تخصصی | آلبوم تصاویر | محصولات و خدمات | پشتیبانی بر خط