تزریق (SQL (Injection
SQL Injection
- یک تزریق SQL میتواند پایگاه داده شما را نابود کند.
SQL در صفحات وب
- در درس های قبلی شما یاد گرفتید که با SQL داده های پایگاه داده را بازیابی و بروز کنید .
- هنگامی که SQL برای نمایش داده بروی صفحه وب استفاده می شود ، رایج است که به کابران وب ، اجاز وارد کردن مقادیر جستجو را بدهد.
- از آنجایی که دستورات SQL متنی می باشند ،خیلی راحت و آسان ،با قطعه کد کوچک کامپیوتری، دستورات SQL را به صورت پویا تغییر داد و داده های انتخاب شده را برای کاربر فراهم کرد.
کد سمت سرور را نگاه کنید:
txtUserId = getRequestString("UserId"); txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
در مثال بالا ، دستور Select را با اضافه کردن یک متغییر (txtUserId) به رشته Select ، نوشتیم.مقدار متغییر از ورودی کاربر در صفحه وب گرفته می شود.
در ادامه ی این بخش آموزشی خطرات عمده ایی که با استفاده از دستوراتی که کاربر وارد میکند را شرح می دهیم.
SQL Injection
SQL Injection تکنیکی است که کاربران مخرب ،میتوانند توسط ورودی صفحات وب ، فرمان های SQLرا در دستوارت SQL تزریق کنند.
فرمان های SQL تزریق شده توانایی تغییر دستورات SQL را دارند و در امنیت یک برنامه وب اختلال ایجاد کند.
دستور Injection مبتنی بر 1=1 که همیشه درست است
یک مرتبه دیگر ، به مثال بالا نگاه کنید.
اجازه بدهید بگویم که هدف اصلی کد بالایی اینست که با استفاده از دستور SQL نوشته شده ، کاربر را با آی دی داده شده انتخاب میکند.
اگر چیزی برای جلوگیری از ورودی نامعتبر وارد شده وجود نداشته باشد ،کاربر می تواند تعدادی ورودی هوشمند مثل این وارد کند:
UserID : 105 OR 1=1
نتیجه کد سمت سروری:
SELECT * FROM Users WHERE UserId = 105 or 1=1
دستور SQL بالا معتبر می باشد. تا زمانی که WHERE 1=1 که همیشه درست می باشد، تمام سطر های جدول کاربران را بر میگرداند
آیا مثال بالا خطرناک به نظر نمی رسد؟چه می شود اگر جدول کاربران شامل نام و پسورد نمایش داده شود؟
دستور SQL بالا همانند این می باشد:
SELECT UserId, Name, Password FROM Users WHERE UserId = 105 or 1=1
یک هکر باهوش ممکن است به سادگی با اضافه کردن 105 or 1=1 در ورودی کاربر، به تمام نام کاربری و رمز عبور ها دسترسی پیدا کند.
دستور Injection مبتنی بر “”=”” که همیشه درست است
در اینجا یک ساختار رایج و متدوال برای ورود کاربر به یک وب سایت استفاده شده است:
کد سمت سرور:
uName = getRequestString("UserName"); uPass = getRequestString("UserPass"); sql = "SELECT * FROM Users WHERE Name ='" + uName + "' AND Pass ='" + uPass + "'"
یک هکر باهوش ممکن است به سادگی با اضافه کردن
or ""=""
در تکس باکس نام کاربری و رمز عبور، به تمام نام کاربری و رمز عبور ها دسترسی پیدا کند.
کد در سمت سرور شبیه این دستور SQL معتبر می شود:
SELECT * FROM Users WHERE Name ="" or ""="" AND Pass ="" or ""=""
نتیجه یک دستور معتبر می باشدتا زمانی که WHERE “”=”” که همیشه درست می باشد، تمام سطر های جدول کاربران را بر میگرداند
دستور Injection مبتنی بردستورات چند گانه
اکثر دیتابیس ها از دستورات SQL چند گانه (بسته بندی شده) ، توسط کاراکتر سمی کاولن (semicolon) پشتیبانی می کنند(در یک خط می توان چندین دستورSQL به کار برد)
مثال:
SELECT * FROM Users; DROP TABLE Suppliers
دستور بالا تمام رکوردهای جدول Users را بر میگرداند ، و بعد جدولی که Suppliers نامیده شده را حذف می کند
اگر کد زیر را داشته باشیم :
txtUserId = getRequestString("UserId"); txtSQL = "SELECT * FROM Users WHERE UserId = " + txtUserId;
و وردی زیر:
User id= 105; DROP TABLE Suppliers
کد در سمت سرور امکان داره یک دستور معتبری ایجاد کند شبیه این:
SELECT * FROM Users WHERE UserId = 105; DROP TABLE Suppliers
پارامترها (Parameters)برای محافظت
برخی از توسعه دهندگان وب از لیست سیاهی از کلمات و کاراکترها ، برای جستجو در ورودی کاربر استفاده میکنند تا از حملات SQL Injection جلوگیری کنند
این ایده خیلی خوبی نیست بسیاری از این لغات مثل delete یا drop و کاراکرهایی مانند سمی کاولون و علامت سئوال ، در یک زبان عمومی و رایج استفاده می شود و باید اجازه وارد کردن اینگونه لغات و حروف را داشته باشند.
- تنها راه جلوگیری و محافظت کردن وب سایتها در برابر جملات SQL Injection استفاده از پارامتر ها (parameters) می باشد.
- پارامترهای SQL مقادیری هستند که به شیوه ی کنترل شده در زمان اجرا یک پرس و جو (query ) اضافه می شوند
مثالی از ASP.NET
txtUserId = getRequestString("UserId"); txtSQL = "SELECT * FROM Users WHERE UserId = @0"; db.Execute(txtSQL,txtUserId);
توجه داشته باشید که پارامترها در دستورات 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);
شما یاد گرفتید که از SQL injection جلوگیری کنید. SQL injection یکی از مهمترین آسیب پذیریهای وب سایت هاست.
مثال ها :
مثالهای زیر به شما نشان می دهد که چگونه پرس و جو های پارامتریزه در زبانهای رایج و متداول وب بسازید.
دستور SELECT در ASP.NET
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
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
$stmt = $dbh->prepare("INSERT INTO Customers (CustomerName,Address,City) VALUES (:nam, :add, :cit)"); $stmt->bindParam(':nam', $txtNam); $stmt->bindParam(':val', $txtAdd); $stmt->bindParam(':cit', $txtCit); $stmt->execute();
برای مشاهده کلیه مقالات مربوط به sql کلیک نمایید.
امتیاز دهی به این مطلب :
امتیاز
جمع امتیازات
لطفا به این مطلب آموزشی امتیاز دهید