تحسين أمان إدراج البيانات في 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
لتجنب ثغرات الأمان. كما تم إضافة التحقق من نجاح التنفيذ وإظهار رسالة مناسبة.
المزيد من المعلومات
بالطبع، دعنا نقوم بتوسيع المعلومات وشرح بعض النقاط الإضافية المتعلقة بالكود:
-
استخدام MySQLi:
يعتبر استخدام MySQLi أفضل منmysql
لأنه يوفر ميزات أمان إضافية وأداء محسن. يوفر MySQLi دعمًا للعديد من المزايا مثل التحضير المسبق للاستعلامات ومعالجة البيانات بطريقة أكثر أمانًا. -
استعلام محمي من SQL Injection:
في الكود المعدل، تم استخدامprepare
وbind_param
لإنشاء استعلام محمي من هجمات SQL Injection. يقومprepare
بتجهيز الاستعلام ويقومbind_param
بربط المتغيرات بالاستعلام، مما يحمي التطبيق من إدخال بيانات ضارة. -
تحديد اسم قاعدة البيانات:
في الاتصال باستخدامmysqli
, تم تحديد اسم قاعدة البيانات ($database
) مباشرة عند إنشاء الاتصال. هذا يزيل الحاجة إلى استخدامmysqli_select_db
بعد الاتصال. -
رسالة الخطأ:
تم إضافة جزء لعرض رسالة الخطأ إذا فشل إدراج البيانات. هذا يساعد على تشخيص المشاكل بشكل أفضل ويسهل فحص السجلات للعثور على أي أخطاء في التنفيذ. -
إغلاق الاتصال:
يجب دائمًا إغلاق الاتصال بقاعدة البيانات بعد الانتهاء من استخدامه. في الكود، تم إضافة$conn->close()
لإغلاق الاتصال بشكل صحيح بمجرد الانتهاء من تنفيذ العمليات.
هذه التحسينات تعزز أمان التطبيق وتجعل الكود أكثر قوة ومرونة. يجب أيضًا متابعة أفضل ممارسات الأمان واستخدام آليات التحقق والتحقق من البيانات لتعزيز أمان تطبيقات PHP الخاصة بك.