My Programming Notes

Here are Notes.... come from debugging

My Programming Notes

Here are Notes.... come from debugging

چهارشنبه, ۲ مهر ۱۳۹۳، ۰۷:۰۹ ب.ظ

ًُُSQL Injection یا تزریق SQL

سر کلاس بودیم و استاد داشتند از عامل ارتباط بین لایه های مختلف نرم افزار – Data Access Layer – می گفتند.

در یک مثال ساده یک فرم لاگین (Log In) درست کردیم . در پایگاه داده هم چند یوزر با اطلاعات کامل ازشون داشتیم.

در تست اولیه با یک دید کاملا مثبت به همه چیز و همه کس یک  Username و Password معتبر را وارد کردیم و عملیات لاگین انجام شد.

در دفعه دوم یک  Username و Password غیر معتبر وارد کردیم و پیغام متناسب با آن نمایش داده شد.

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

یکی از حالت های بدی که ممکن است در وارد کردن اطلاعات چنین فرم اتفاق بیفتد یک روش هک است به نام SQL Injection  که در لغت به معنی تزریق کد SQL است.

 

 SQL Injection   یعنی :

هک برنامه از طریق وارد کردن دستورات مخرب T- SQL و وارد کردن آسیب جدی به ساختار برنامه.

        

 

فرض کنید برنامه نویسی کد زیر را در برنامه نوشته باشد :

SqlCommand Command =new SqlCommand ("select count(*) from login where user='"+userName+"' and pass='"+password+"'",connection);

البته شاید این نحوه کد نویسی به نظر افراد خبره مسخره بیاد ولی خوب کار است دیگر ... پیش میاد :D

اگر کاربر داده های صحیح   UserName = Zakizadeh  و Password= 123456  را وارد کند ، کد sql  به صورت زیر خواهد بود:

Select  count(*) from login where user='Zakizadeh' and pass='123456'

اگر هکر عزیز و یا یک کاربر نا آشنا از روی بازی OR 1=1 را وارد نماید دستور به شکل زیر می شود:

Select count(*) from login where user='Enemy' and pass=''” or 1=1 --'

1=1 همیشه برابر مقدار True خواهد شد، پس کاربر بدون داشتن نام کاربری و رمز ورود می تواند وارد نرم افزار شود. و یا با وارد کردن دستور DELETE در جای مناسبی می تواند اطلاعات جدول های مهم را پاک کند. و یا خیلی اتفاقای دیگه!

برای جلوگیری از این اتفاق راه های زیادی هست ولی یکی از ساده ترین روش ها اینه که "هرگز وردی کاربر را با استفاده از + و یا   String.format به متن دستور الحاق نکنیم." و به جای الحاق رشته ای از پارامترها استفاده کنیم:

 

SqlCommand Command=new SqlCommand ("select count(*) from login where user=@user and pass=@pass",Connection);

Command.Parameters.Add("@user", SqlDbType.Varchar, 10).Value=TextLogin.Text.Trim();

Command.Parameters.Add("@pass", SqlDbType.Varchar,10).Value=TextPwd.Text.Trim();

 

 

 

*شاید به نظرتون این مشکل دیگه پیش پا افتاده بیاد و یا اینکه بگید یه برنامه نویس خوب هیچ وقت یه همچین اشتباهی نمی کنه. و یا حتی این کار نیاز به هوش بالایی نداره! من هم این مطلب رو به عنوان اطلاع رسانی منتشر کردم. :D

موافقین ۴ مخالفین ۰ ۹۳/۰۷/۰۲
سارا زکی زاده

Hack

SQL

SQL Injection

نظرات  (۱)

۰۵ مهر ۹۳ ، ۲۰:۰۷ میثم هوشمند
خیلی هم خوب بود انتشار این مطلب؛
گاهی اوقات نیتش نوشتن از خود نوشته مهمتره!

یک کاری کنید؛ 
همین دستور آخر را که توی برنامه استفاده می کنید؛
کنارش اجرای برنامه از sql profiler استفاده کنید
ببینید چه دستور t-sql ای به دیتابیس ارسال میشه؛
جالبه!
موفق باشید
خوشحال شدم دیدم پست گذاشتید

پاسخ:
آموختن نکات برای من کلی هیجان داره به همین دلیل همین نکات هر چند کوچک رو منتشر می کنم.
حتما توصیه شما رو تست می کنم و جوابش رو منتشر می کنم.
ممنون از راهنماییتون.

ارسال نظر

ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی