با عرض سلام و وقت بخیر خدمت کاربران سایت پی وی لرن . و کاربرانی که دوره آموزش کامل SQL را دنبال می کنند. در آموزشهایی که تاکنون ارائه کردیم. تمام دستورات و کدهای SQL را در محیط SQL ، پیاده سازی و اجرا می کردیم. و در واقع در داخل پایگاه داده خود به جداول و داده های موجود دسترسی داشتیم. اما در این آموزش دسترسی ها ی خارج از پایگاه داده و بانک اطلاعاتی به جداول و داده های SQL را بررسی می کنیم. این مباحث بسیار هائز اهمیت است،چراکه اغلب عملیات هک و دسترسی های غیر مجاز، از طریق وب سایت ها صورت می گیرد.در ادامه برای آشنایی با تکنیک Injection در SQL و مقابله با حملات SQL injection با ما همراه باشید.
تکنیک SQL injection، در واقع یک تکنیک تزریق کد است، که برای نفوذ به سایر پایگاه های داده استفاده می شود.
injection از رایج ترین روشهای هک کردن یک وب سایت است.
injection در واقع تزریق کدهای SQL، در ورودی صفحه وب است.
SQL injection زمانی رخ می دهد که شما از یک کاربر برای ورودی درخواست می کنید.
اطلاعات نام کاربری و رمز عبور ، در قالب کدهای SQL برای شما ارسال می شود.
مثال:
ایجاد یک کد SELECT با افزودن متغیر txtUserId برای انتخاب نوع string از جدول Users :
1 2 | txtUserId = getRequestString("UserId"); txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId; |
به مثال فوق دقت کنید. هدف ایجاد یک دستور SELECT، برای انتخاب از جدول Users، بر اساس UserId دریافتی از کاربر است.
اگر کدی برای کنترل ورودی کاربر، و جلوگیری از وارد کردن ورودی اشتباه، ایجاد نکرده اید، می توانید از کد هوشمند زیر استفاده کنید:
UserId:
و کد SQL مثال فوق، می تواند بصورت زیر باشد:
1 | SELECT * FROM Users WHERE UserId = 105 OR 1=1; |
کد فوق تمام رکوردهای جدول “Users” را انتخاب می کند، چراکه عبارت OR 1=1،در SQL، همیشه True است.
اما اگر جدول فوق دارای فیلدهایی مانند نام و رمز عبور باشد،می توانید از کدی مانند نمونه زیر استفاده کنید:
1 | SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1; |
هکر می تواند به تمام نامهای کاربری و کلمه عبور در یک پایگاه داده، به سادگی با قرار دادن ۱۰۵ OR 1 = 1 در فیلد ورودی، دسترسی پیدا کند.
ورودی ها زیر ، مثالی از فرم Login یک وب سایت است:
Username:
Password:
1 2 3 4 | uName = getRequestString("username"); uPass = getRequestString("userpassword"); sql = 'SELECT * FROM Users WHERE Name ="' + uName + '" AND Pass ="' + uPass + '"' |
نتایج در SQL:
1 | SELECT * FROM Users WHERE Name ="John Doe" AND Pass ="myPass" |
یک هکر ممکن است به سادگی با وارد کردن “OR” “=” به نام کاربری یا رمز عبور جعبه متن به نامهای کاربری و کلمه عبور در یک پایگاه داده دسترسی پیدا کند:
User Name:
Password:
سپس کد موجود در سرور یک عبارت معتبر SQL ایجاد می کند مثل این:
1 | SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""="" |
کد فوق تمام رکوردهای جدول “Users” را انتخاب می کند، چراکه عبارت OR “”=””،در SQL، همیشه True است.
اغلب بانک های اطلاعاتی از ساختار batched پشتیبانی می کنند.
یک batch در واقع گروهی از یک یا دو کد SQL است که با سمی کولون (;) از هم جدا شده اند.
مثال:
کد SQL زیر، ابتدا تمام رکوردهای جدول Users را انتخاب کرده و سپس جدول Suppliers را حذف می کند:
1 | SELECT * FROM Users; DROP TABLE Suppliers |
به مثال زیر توجه کنید:
1 2 | txtUserId = getRequestString("UserId"); txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId; |
حالا فرض کنیم کاربر ورودی زیر را وارد کند:
User id:
نتیجه مثال فوق در SQL بصورت زیر خواهد بود:
1 | SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers; |
برای محافظت از وب سایت خود در برابر SQL injection، شما می توانید از پارامترهای SQL استفاده کنید:
استفاذه از پارامترها در query های SQL باعث جلوگیری از نفوذ injection می شود.
مثال:
1 2 3 | txtUserId = getRequestString("UserId"); txtSQL = "SELECT * FROM Users WHERE UserId = @0"; db.Execute(txtSQL,txtUserId); |
برای دریافت ورودی با استفاده از پارامتر در SQL باید از علامت “@” قبل از نام پارامتر، استفاده کنید.
موتور SQL هر پارامتر را بررسی می کند تا اطمینان حاصل شود که فیلد آن درست است. و ورودی ها، به عنوان بخشی از SQL اجرا نشود.
مثال۲:
1 2 3 4 5 | 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); |
مثالهای زیر، چگونگی استفاده از پارمترها را در پرس و جوهای SQL، نشان می دهد:
مثال۱:
کدهای SELECT در ASP.NET:
1 2 3 4 5 | txtUserId = getRequestString("UserId"); sql = "SELECT * FROM Customers WHERE CustomerId = @0"; command = new SqlCommand(sql); command.Parameters.AddWithValue("@0",txtUserID); command.ExecuteReader(); |
مثال۲:
کد INSERT INTO در ASP.NET:
1 2 3 4 5 6 7 8 9 | 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(); |
کد INSERT INTO در PHP:
1 2 3 4 5 6 | $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(); |
در این آموزش، ما یکی از ابزارهای مهم دسترسی غیر مجاز و نفوذ به داده های یک پایگاه داده که توسط هکرها استفاده می شود را بررسی کردیم. و در ادامه چگونگی مقابله با این تهدیدات را نیز، ارائه کردیم. امیدواریم که از مباحث آموزش آشنایی با تکنیک Injection در SQL بخوبی استفاده کرده باشید.
mina
دوره آموزش sql خیلی خوب بود. متشکرم
پی وی لرن
سلام
ممنون، نظر لطف شماست