دروس SQL

SQL الصفحة الرئيسية مقدمة SQL بناء جملة SQL حدد SQL حدد SQL مميزة SQL أين SQL و ، أو ، لا ترتيب SQL حسب إدراج SQL في قيم SQL الفارغة تحديث SQL حذف SQL حدد SQL الأعلى SQL Min و Max عدد SQL ، المتوسط ​​، المجموع SQL مثل SQL Wildcards SQL في SQL بين الأسماء المستعارة لـ SQL SQL ينضم انضمام SQL الداخلية انضمام SQL الأيسر SQL حق الانضمام SQL انضمام كامل الانضمام الذاتي SQL اتحاد SQL مجموعة SQL حسب SQL وجود SQL موجود SQL أي ، الكل SQL حدد Into إدراج SQL في التحديد حالة SQL وظائف SQL الفارغة إجراءات SQL المخزنة تعليقات SQL عوامل SQL

قاعدة بيانات SQL

إنشاء قاعدة بيانات SQL SQL Drop DB SQL النسخ الاحتياطي DB إنشاء جدول SQL جدول إسقاط SQL جدول تعديل SQL قيود SQL SQL ليس لاغى SQL الفريدة مفتاح SQL الأساسي المفتاح الخارجي لـ SQL فحص SQL SQL الافتراضي فهرس SQL زيادة SQL التلقائية تواريخ SQL طرق عرض SQL حقن SQL استضافة SQL أنواع بيانات SQL

مراجع SQL

كلمات SQL وظائف MySQL وظائف خادم SQL وظائف MS Access المرجع السريع SQL

أمثلة SQL

أمثلة SQL اختبار SQL تمارين SQL شهادة SQL

حقن SQL


حقن SQL

حقن SQL هو أسلوب إدخال رمز قد يؤدي إلى تدمير قاعدة البيانات الخاصة بك.

يعد حقن SQL أحد أكثر تقنيات اختراق الويب شيوعًا.

حقن SQL هو وضع التعليمات البرمجية الضارة في عبارات SQL ، عبر إدخال صفحة الويب.


SQL في صفحات الويب

يحدث حقن SQL عادةً عندما تطلب من مستخدم إدخاله ، مثل اسم المستخدم / معرف المستخدم الخاص به ، وبدلاً من الاسم / المعرف ، يمنحك المستخدم عبارة 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 أعلاه صالحًا وسيعيد كل الصفوف من جدول "المستخدمون" ، نظرًا لأن OR 1 = 1 يكون دائمًا TRUE.

هل المثال أعلاه يبدو خطيرا؟ ماذا لو احتوى جدول "المستخدمون" على أسماء وكلمات مرور؟

عبارة SQL أعلاه هي نفسها إلى حد كبير:

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

قد يتمكن المتسلل من الوصول إلى جميع أسماء المستخدمين وكلمات المرور في قاعدة البيانات ، عن طريق إدخال 105 أو 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 أعلاه صالح وسيعيد كافة الصفوف من جدول "المستخدمون" ، حيث أن OR "" = " تكون دائمًا TRUE.


حقن SQL على أساس عبارات SQL المجمعة 

تدعم معظم قواعد البيانات جملة SQL المجمعة.

مجموعة جمل SQL هي مجموعة من عبارتين أو أكثر من عبارات SQL ، مفصولة بفواصل منقوطة.

ستُرجع عبارة SQL أدناه كافة الصفوف من جدول "المستخدمون" ، ثم تحذف جدول "الموردون".

مثال

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();