ورود / ثبت نام
0
0

استفاده از Query های پارامتری برای جلوگیری از SQL Injection

526 بازدید
SQL Injection

SQL Injection

برای فهمیدن بهتر اینکه چرا شما نیاز به استفاده از Query های پارامتری برای جلوگیری از SQL Injection در   Concatenated inline Query دارید ، باید SQL Injection را درک کنید. در ادامه با توضیحات کامل در رابطه با SQL Injection و همچنین روش جلوگیری با آن در خدمت شما هستیم .
پس با من همراه باشید …

SQL Injection

SQL Injection زمانی است که کاربر مقادیر نامعتبری را به عنوان ورودی در عملیات های CRUD وارد میکند و یا به زور Query اشتباهی را در دیتا بیس اجرا کند که ممکن است برای دیتابیس مضر باشد.

مضر به معنای از دست دادن داده و یا ورودی های نامعتبر میباشد.

برای یادگیری بیشتر ، روش زیر را دنبال کنید :

گام اول

جدولی به نام Login در یک دیتا بیس بسازید.

create table User_Login   
(   
UserID varchar(20),   
Pwd varchar(20)   
)

 

SQL Injection

حال تعدادی اعتبار را در دیتا بیس به منظور ورود و انتخاب جدول وارد کنید.

insert into user_login values('rahul','bansal@123')   
insert into user_login values('bansal','rahul@123')  

SQL Injection

گام دوم

وب سایتی به نام Website1 بسازید.

SQL Injection

حال ما صفحه ای بنام login میسازیم و برای تایید اعتبار از جدول Login نام آن را Default.aspx میگذاریم و اگر کاربر وجود داشت آنگاه آن را به صفحه ی بعد با نام Home.aspx هدایت میکنیم.

دو عدد TextBox به ترتیب برای UserID و Password و دکمه ای برای ورود وارد میکنیم.

SQL Injection

دو فضای نام در فایل .CS صفحه ی Default.aspx اضافه کنید.

using System.Data.SqlClient;   
using System.Data;  

اکنون کد زیر را برای معتبرسازی اعتبارات از دیتابیس بر روی رویداد کلیک دکمه ی Login اضافه میکنیم.

protected void btn_Login_Click(object sender, EventArgs e)    
{   
string constr = System.Configuration.ConfigurationManager.ConnectionStrings["Constr"].ConnectionString;   
SqlConnection con = new SqlConnection(constr);   
string sql = "select count(UserID) from user_login where UserID='" + txtUSerID.Text + "' and pwd='" + txtPwd.Text + "'";   
SqlCommand cmd = new SqlCommand(sql, con);   
con.Open();   
object res = cmd.ExecuteScalar();   
con.Close();   
if (Convert.ToInt32(res) > 0) Response.Redirect("Home.aspx");   
else    
{   
Response.Write("Invalid Credentials");   
return;   
}   
} 

SQL Injection

صفحه ی جدیدی با نام Home.aspx اضافه کنید.

SQL Injection

جایی که هر کاربر معتبری یک پیام خوش آمد دریافت میکند.

SQL Injection

گام سوم

حال صفحه ی Default را اضافه کنید و با یک آیدی معتبر وارد شوید.

SQL Injectionکاربر معتبر را به صفحه ی Home.aspx هدایت میکند.

SQL Injection

نکته :

۱ . در اینجا من از خاصیت TextMode=”Password” برای Password TextBox برای نمایش Password استفاده نکردم.

۲ . من هیچ ورودی معتبری برای توضیح مثالم استفاده نکردم.

مشکل : حال من SQL Injection را با اعتبارات نامعتبر به همراه اجرای query های موفق پیاده میکنم و سپس آن را به صفحه ی Home.aspx به عنوان یک کاربر معتبر هدایت میکنم.

در هر دو TextBox رشته ی زیر را وارد میکنیم :

‘or’1’=1

حال صفحه و Login را با رشته ی بالا در هر دو TextBox اجرا کنید.

SQL Injection

همانطور که در زیر میبینیم به عنوان یک کاربر معتبر هدایت شده است.

SQL Injection

چه اتفاقی افتاد ؟ در دنیای هک به آن SQL Injection گفته میشود.

دلیل

تنها به خاطر رشته این اتفاق می افتد و پس از وارد کردن این رشته در هر دو TextBox ، SQL Query مان شبیه زیر خواهد شد :

select count(UserID) from user_login where UserID='' or '1'='1' and pwd='' or '1'='1'

آن شمارش UserID را ارائه میدهد که در جدول ۲ است زیرا ۲ کاربر در جدول user_login وجود دارد.

از آن میتوان در روش های بیشتری استفاده کرد مانند پر کردن UserID TextBox با استفاده از رشته های زیر و شما به عنوان یک کاربر معتبر به صفحه بعد فرستاده میشوید.

Or 1=1 – –

و این نیز ۲ شماره کاربران را ارائه میدهد زیرا SQL Query همانند زیر خواهد شد :

select count(UserID) from user_login where UserID='' or 1=1 --' and pwd='' or '1'='1'

نکته : نشانه ی – برای کامنت گذاری متن بالا در SQL است.

این میتواند بسیار خطرناکتر و مضرتر باشد زمانی که یک کاربر/هکر نامعتبر یک Script را برای انداختن همه ی جدول ها در دیتا بیس یا انداختن کل یک دیتا بیس اجرا کند.

راه حل

برای حل این مشکل احتیاج به انجام دو کار دارید :

۱ . همیشه از Query های پارامتری استفاده کنید.

۲ . اعتبارسنجی ورودی ها در هر دو سمت سرور و کاربر

گاهی اوقات اگر اعتبارسنجی ورودی ناموفق باشد ، آنگاه پارامتر ها هیچ مقدار Script ای را اجرا نمیکنند.

بیایید نگاهی به مثال بیاندازیم.

protected void btn_Login_Click(object sender, EventArgs e)    
{   
string constr = System.Configuration.ConfigurationManager.ConnectionStrings["Constr"].ConnectionString;   
SqlConnection con = new SqlConnection(constr);   
string sql = "select count(UserID) from user_login where UserID=@UserID and pwd=@pwd";   
SqlCommand cmd = new SqlCommand(sql, con);   
SqlParameter[] param = new SqlParameter[2];   
param[0] = new SqlParameter("@UserID", txtUSerID.Text);   
param[1] = new SqlParameter("@pwd", txtPwd.Text);   
cmd.Parameters.Add(param[0]);   
cmd.Parameters.Add(param[1]);   
con.Open();   
object res = cmd.ExecuteScalar();   
con.Close();   
if (Convert.ToInt32(res) > 0) Response.Redirect("Home.aspx");   
else    
{   
Response.Write("Invalid Credentials");   
return;   
}   
}

SQL Injection

حال اگر من صفحه را اجرا کنم و سعی کنم که با SQL Script ها همانند قبل وارد شوم :

با ‘or’1’=’1

SQL Injection

یا ‘or 1=1 – –

SQL Injection

همانطور که میبینید پارامتر ها ، SQL Script ها را اجرا نکردند. اما چرا ؟

دلیل : دلیل این امر نیز این است که Query های پارامتری آسیب پذیر نخواهند بود و به جای آن به دنبال آیدی و رمز عبور کاربری که عینا مشابه کل رشته باشد میگردد.

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

جمع بندی

همیشه از Query های پارامتری و معتبرسازی ورودی ها در هر دو سمت سرور و کاربر استفاده کنید.

  • پسورد: www.mspsoft.com
آیا این مطلب را می پسندید؟
https://www.mspsoft.com/?p=14592
اشتراک گذاری:
واتساپتوییترفیسبوکپینترستلینکدین
داریوش فرخی
داریوش فرخی هستم از سال 92 شروع به یادگیری برنامه نویسی و از سال 93 در بخش برنامه نویسی و تولید محتوای سایت mspsoft.com مشغول هستم. فعالیتم نیز بیشتر در زمینه های برنامه نویسی با سی شارپ و asp.net بوده است. اوقات فراغتم را هم غالبا با تماشای فیلم یا بازی های کامپیوتری پر میکنم .
مطالب بیشتر
برچسب ها:

نظرات

0 نظر در مورد استفاده از Query های پارامتری برای جلوگیری از SQL Injection

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

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

هیچ دیدگاهی نوشته نشده است.