تعلمك مقالة ويكي هاو هذه كيفية منع حقن SQL باستخدام البيانات المعدة في PHP. يعد إدخال SQL أحد أكثر الثغرات الأمنية شيوعًا في تطبيقات الويب اليوم. تستخدم العبارات المعدة معلمات منضمة ولا تدمج المتغيرات مع سلاسل SQL ، مما يجعل من المستحيل على المهاجم تعديل عبارة SQL.
تدمج البيانات المعدة المتغير مع عبارة SQL المترجمة ، بحيث يتم إرسال SQL والمتغيرات بشكل منفصل. ثم يتم تفسير المتغيرات على أنها مجرد سلاسل وليست جزءًا من عبارة SQL. باستخدام الطرق الواردة في الخطوات أدناه ، لن تحتاج إلى استخدام أي تقنيات أخرى لتصفية حقن SQL مثل mysql_real_escape_string ().
خطوات
جزء 1 من 2: فهم حقن SQL
الخطوة الأولى. حقن SQL هو نوع من الثغرات الأمنية في التطبيقات التي تستخدم قاعدة بيانات SQL
تنشأ الثغرة الأمنية عند استخدام إدخال المستخدم في عبارة SQL:
$ name = $ _GET ['اسم المستخدم'] ؛ $ query = "حدد كلمة المرور من tbl_user WHERE name = '$ name'" ؛
الخطوة الثانية. القيمة التي يُدخلها المستخدم في اسم مستخدم متغير URL سيتم تعيينها إلى المتغير $ name
ثم يتم وضعها مباشرة في جملة SQL ، مما يتيح للمستخدم تحرير عبارة SQL.
$ name = "admin 'OR 1 = 1 -" ؛ $ query = "حدد كلمة المرور من tbl_user WHERE name = '$ name'" ؛
الخطوة 3. ستتلقى قاعدة بيانات SQL بعد ذلك جملة SQL على النحو التالي:
حدد كلمة المرور من tbl_users WHERE name = 'admin' OR 1 = 1 - '
-
هذا هو SQL صالح ، ولكن بدلاً من إرجاع كلمة مرور واحدة للمستخدم ، ستُرجع العبارة جميع كلمات المرور في الجدول tbl_user. هذا ليس شيئًا تريده في تطبيقات الويب الخاصة بك.
جزء 2 من 2: استخدام mySQLi لإنشاء بيانات معدة
الخطوة الأولى. قم بإنشاء استعلام mySQLi SELECT
استخدم الكود أدناه لتحديد البيانات من جدول باستخدام البيانات المعدة من mySQLi.
$ name = $ _GET ['اسم المستخدم'] ؛ if ($ stmt = $ mysqli-> تحضير ("SELECT password FROM tbl_users WHERE name =؟")) {// اربط متغيرًا بالمعامل كسلسلة. $ stmt-> bind_param ("s"، $ name)؛ // تنفيذ البيان. $ stmt-> تنفيذ () ؛ // احصل على المتغيرات من الاستعلام. $ stmt-> bind_result ($ pass)؛ // إحضار البيانات. $ stmt-> fetch ()؛ // عرض البيانات. printf ("كلمة المرور للمستخدم٪ s هي٪ s / n"، $ name، $ pass)؛ // أغلق البيان المعد. $ stmt-> close ()؛ }
ملاحظة: المتغير mysqli $ هو كائن اتصال mySQLi
الخطوة الثانية. قم بإنشاء استعلام mySQLi INSERT
استخدم الكود أدناه لإدخال البيانات في جدول باستخدام MySQLi Prepared Statements.
$ name = $ _GET ['اسم المستخدم'] ؛ $ password = $ _GET ['password'] ؛ if ($ stmt = $ mysqli-> تحضير ("INSERT INTO tbl_users (name، password) VALUES (؟،؟)")) {// اربط المتغيرات بالمعامل كسلاسل. $ stmt-> bind_param ("ss"، $ name، $ password)؛ // تنفيذ البيان. $ stmt-> تنفيذ () ؛ // أغلق البيان المعد. $ stmt-> close ()؛ }
ملاحظة: المتغير mysqli $ هو كائن اتصال mySQLi
الخطوة الثالثة. قم بإنشاء استعلام تحديث mySQLi
استخدم الكود أدناه لتحديث البيانات في جدول باستخدام البيانات المعدة من mySQLi.
$ name = $ _GET ['اسم المستخدم'] ؛ $ password = $ _GET ['password'] ؛ if ($ stmt = $ mysqli-> Prepar ("UPDATE tbl_users SET password =؟ WHERE name =؟")) {// اربط المتغيرات بالمعامل كسلاسل. $ stmt-> bind_param ("ss"، $ password، $ name)؛ // تنفيذ البيان. $ stmt-> تنفيذ () ؛ // أغلق البيان المعد. $ stmt-> close ()؛ }
ملاحظة: المتغير mysqli $ هو كائن اتصال mySQLi
الخطوة 4. قم بإنشاء استعلام الحذف في mySQLi
البرنامج النصي أدناه هو كيفية حذف البيانات من جدول باستخدام البيانات المعدة من mySQLi.
$ name = $ _GET ['اسم المستخدم'] ؛ $ password = $ _GET ['password'] ؛ if ($ stmt = $ mysqli-> PreparE ("DELETE FROM tbl_users WHERE name =؟")) {// اربط المتغير بالمعامل كسلسلة. $ stmt-> bind_param ("s"، $ name)؛ // تنفيذ البيان. $ stmt-> تنفيذ () ؛ // أغلق البيان المعد. $ stmt-> close ()؛ }