ًُُ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