البرمجة

تحسين أمان إدراج البيانات في PHP باستخدام MySQLi

بدايةً، يظهر أن لديك رغبة في إدراك مشكلة يواجهها الكود الخاص بك عند محاولة إدراج بيانات في قاعدة البيانات باستخدام لغة PHP. سنقوم بتحليل الكود الخاص بك والتعقيب على الأمور التي يمكن تحسينها.

أولًا وقبل كل شيء، يجدر بنا أن نلاحظ أنك قد استخدمت دالة mysql_select_db وهي جزء من امتداد MySQL المهجور. في الوقت الحالي، يفضل استخدام مكتبة MySQLi أو PDO. لذلك، يمكنك استخدام دالة mysqli_select_db بدلاً من mysql_select_db لضمان التوافق مع الإصدارات الحديثة من PHP.

ثانيًا، قد لاحظت أنك قد استخدمت كائن mysqli لإنشاء اتصال بقاعدة البيانات، ولكن لم تقم بتحديد اسم قاعدة البيانات. يُفضل تعيين اسم قاعدة البيانات باستخدام الدالة select_db بعد إنشاء الاتصال.

المشكلة الرئيسية تكمن في استخدام دوال متباينة. على سبيل المثال، قمت باستخدام mysqli لإنشاء الاتصال ولكن استخدمت mysql لتحديد قاعدة البيانات وتنفيذ الاستعلام. يجب أن يكون الاختيار متناسقًا بين mysqli أو mysql، ولا يجب مزج الاثنين.

إليك تصحيح مقترح للكود:

php
$host = "localhost"; $user = "root"; $password = ""; $database = "crud"; // إنشاء اتصال باستخدام MySQLi $conn = new mysqli($host, $user, $password, $database); // التحقق من الاتصال if ($conn->connect_error) { die("فشل الاتصال: " . $conn->connect_error); } if(isset($_POST['btn-save'])) { $first_name = $_POST['first_name']; $last_name = $_POST['last_name']; $city_name = $_POST['city_name']; // استخدام استعلام محمي من SQL Injection $sql_query = $conn->prepare("INSERT INTO users(first_name, last_name, user_city) VALUES (?, ?, ?)"); $sql_query->bind_param("sss", $first_name, $last_name, $city_name); if($sql_query->execute()) { echo "تم إدراج البيانات بنجاح."; } else { echo "حدث خطأ أثناء إدراج البيانات: " . $conn->error; } // إغلاق استعلام SQL $sql_query->close(); } // إغلاق اتصال MySQLi $conn->close(); ?>

يتم استخدام mysqli بدلاً من mysql، ويتم استخدام استعلام محمي من SQL Injection باستخدام prepare و bind_param لتجنب ثغرات الأمان. كما تم إضافة التحقق من نجاح التنفيذ وإظهار رسالة مناسبة.

المزيد من المعلومات

بالطبع، دعنا نقوم بتوسيع المعلومات وشرح بعض النقاط الإضافية المتعلقة بالكود:

  1. استخدام MySQLi:
    يعتبر استخدام MySQLi أفضل من mysql لأنه يوفر ميزات أمان إضافية وأداء محسن. يوفر MySQLi دعمًا للعديد من المزايا مثل التحضير المسبق للاستعلامات ومعالجة البيانات بطريقة أكثر أمانًا.

  2. استعلام محمي من SQL Injection:
    في الكود المعدل، تم استخدام prepare و bind_param لإنشاء استعلام محمي من هجمات SQL Injection. يقوم prepare بتجهيز الاستعلام ويقوم bind_param بربط المتغيرات بالاستعلام، مما يحمي التطبيق من إدخال بيانات ضارة.

  3. تحديد اسم قاعدة البيانات:
    في الاتصال باستخدام mysqli, تم تحديد اسم قاعدة البيانات ($database) مباشرة عند إنشاء الاتصال. هذا يزيل الحاجة إلى استخدام mysqli_select_db بعد الاتصال.

  4. رسالة الخطأ:
    تم إضافة جزء لعرض رسالة الخطأ إذا فشل إدراج البيانات. هذا يساعد على تشخيص المشاكل بشكل أفضل ويسهل فحص السجلات للعثور على أي أخطاء في التنفيذ.

  5. إغلاق الاتصال:
    يجب دائمًا إغلاق الاتصال بقاعدة البيانات بعد الانتهاء من استخدامه. في الكود، تم إضافة $conn->close() لإغلاق الاتصال بشكل صحيح بمجرد الانتهاء من تنفيذ العمليات.

هذه التحسينات تعزز أمان التطبيق وتجعل الكود أكثر قوة ومرونة. يجب أيضًا متابعة أفضل ممارسات الأمان واستخدام آليات التحقق والتحقق من البيانات لتعزيز أمان تطبيقات PHP الخاصة بك.

زر الذهاب إلى الأعلى