٪۴۰ تخفیف تابستانه شروع شد! بزرگترین حراج سال ما

به ما بپیوندید

آموزش تزریق SQL

تزریق SQL تزریق SQL یک روش تزریق کد است که ممکن است پایگاه داده شما را از بین ببرد. تزریق SQL یکی از رایج ترین تکنیک های هک وب است. تزریق SQL عبارت است از قرار دادن کد مخرب در…

محمد یوسفی

20 آگوست 2021

تزریق SQL

تزریق SQL یک روش تزریق کد است که ممکن است پایگاه داده شما را از بین ببرد.

تزریق SQL یکی از رایج ترین تکنیک های هک وب است.

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


SQL در صفحات وب

تزریق SQL معمولاً زمانی اتفاق می افتد که از یک کاربر درخواست می کنید ، مانند نام کاربری/userid ، و به جای نام/شناسه ، کاربر یک دستور SQL به شما می دهد که ناخواسته روی پایگاه داده خود اجرا می کنید.

به مثال زیر نگاه کنید که SELECTبا افزودن یک متغیر (txtUserId) به یک رشته انتخاب شده ، یک دستور ایجاد می کند . متغیر از ورودی کاربر (getRequestString) واکشی می شود:

مثال

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

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


تزریق SQL بر اساس 1 = 1 همیشه درست است

دوباره به مثال بالا نگاه کنید. هدف اصلی کد ایجاد یک دستور SQL برای انتخاب کاربر با شناسه کاربری داده شده بود.

اگر هیچ چیزی مانع از ورود ورودی “اشتباه” به کاربر نشود ، کاربر می تواند برخی از ورودی های “هوشمند” را مانند این وارد کند:

شناسه کاربر: 

سپس ، دستور SQL به شکل زیر خواهد بود:

SELECT * FROM Users WHERE UserId = 105 OR 1=1;

SQL بالا معتبر است و همه سطرها را از جدول “Users” باز می گرداند ، زیرا OR 1 = 1 همیشه TRUE است.

آیا مثال بالا خطرناک به نظر می رسد؟ اگر جدول “کاربران” شامل نام و رمز عبور باشد چه؟

دستور SQL بالا تقریبا مشابه این است:

SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;
SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1;

یک هکر ممکن است به سادگی با وارد کردن 105 OR 1 = 1 در قسمت ورودی به همه نامهای کاربری و رمزهای عبور موجود در پایگاه داده دسترسی پیدا کند.


تزریق SQL بر اساس “” = “” همیشه درست است

در اینجا نمونه ای از ورود کاربر به وب سایت آمده است:

نام کاربری:

کلمه عبور:

مثال

uName = getRequestString("username");
uPass = getRequestString("userpassword");

sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"'

نتیجه

SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass"

یک هکر ممکن است به سادگی “OR” “=” را در جعبه متن نام کاربری یا رمز عبور به نام کاربری و رمزهای عبور در پایگاه داده دسترسی پیدا کند:

نام کاربری:

کلمه عبور:

کد در سرور یک دستور SQL معتبر مانند این ایجاد می کند:

نتیجه

SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""

SQL بالا معتبر است و همه سطرهای جدول “Users” را برمی گرداند ، زیرا OR “” = “” همیشه TRUE است.


تزریق SQL بر اساس بیانیه های SQL دسته بندی شده

اکثر پایگاه های داده از دستورات SQL دسته ای پشتیبانی می کنند.

دسته ای از دستورات SQL گروهی از دو یا چند عبارت SQL است که با نقطه ویرگول از هم جدا شده اند.

دستور SQL زیر همه سطرهای جدول “Users” را برمی گرداند ، سپس جدول “Suppliers” را حذف می کند.

مثال

SELECT * FROM Users; DROP TABLE Suppliers

به مثال زیر توجه کنید:

مثال

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;

و ورودی زیر:

شناسه کاربر: 

دستور معتبر SQL به این شکل است:

نتیجه

SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers;

برای حفاظت از پارامترهای SQL استفاده کنید

برای محافظت از وب سایت در برابر تزریق SQL ، می توانید از پارامترهای SQL استفاده کنید.

پارامترهای SQL مقادیری هستند که در زمان اجرا به صورت کنترل شده به پرس و جو SQL اضافه می شوند.

نمونه تیغ ASP.NET

txtUserId = getRequestString("UserId");
txtSQL = "SELECT * FROM Users WHERE UserId = @0";
db.Execute(txtSQL,txtUserId);

توجه داشته باشید که پارامترها در دستور SQL با نشانگر @ نشان داده می شوند.

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

مثالی دیگر

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
db.Execute(txtSQL,txtNam,txtAdd,txtCit);

مثال ها

مثالهای زیر نحوه ایجاد پرس و جوهای پارامتری در برخی از زبانهای رایج وب را نشان می دهد.

انتخاب اظهارنامه در ASP.NET:

txtUserId = getRequestString("UserId");
sql = "SELECT * FROM Customers WHERE CustomerId = @0";
command = new SqlCommand(sql);
command.Parameters.AddWithValue("@0",txtUserId);
command.ExecuteReader();

در ASP.NET وارد اظهارات شوید:

txtNam = getRequestString("CustomerName");
txtAdd = getRequestString("Address");
txtCit = getRequestString("City");
txtSQL = "INSERT INTO Customers (CustomerName,Address,City) Values(@0,@1,@2)";
command = new SqlCommand(txtSQL);
command.Parameters.AddWithValue("@0",txtNam);
command.Parameters.AddWithValue("@1",txtAdd);
command.Parameters.AddWithValue("@2",txtCit);
command.ExecuteNonQuery();

وارد کردن بیانیه در PHP:

$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City)
VALUES (:nam, :add, :cit)");
$stmt->bindParam(':nam', $txtNam);
$stmt->bindParam(':add', $txtAdd);
$stmt->bindParam(':cit', $txtCit);
$stmt->execute();

منبع

مطالب مرتبط

0 0 رای ها
امتیازدهی به مقاله
اشتراک در
اطلاع از
guest
0 نظرات
بازخورد (Feedback) های اینلاین
مشاهده همه دیدگاه ها