منع حقن SQL في PHP
إذا لم تتم معالجة إدخال المستخدم بشكل صحيح وإدخاله في استعلام SQL ، فسيحدث ضعف حقن SQL. لفهم هذا الخطر ، فكر في المثال التالي:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
في هذا السيناريو ، إذا كان المستخدم يدخل بشكل ضار قيمة مشابهة لقيمة
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
تقنيات الخلط:
الموصى بها ممارسات الأمان لمنع حقن SQL هي فصل البيانات عن SQL ، بغض النظر عن قاعدة البيانات التي تستخدمها. هذا يعني ضمان معاملة البيانات على أنها بيانات ولا يتم تفسيرها أبدًا كأمر من قبل محلل SQL. الطريقة الأكثر فعالية لتحقيق ذلك هي استخدام عبارات المعالجة المسبقة والاستعلامات المعلمة.
عبارات ما قبل المعالجة والاستعلامات المعلمة:]
يتضمن عبارة المعالجة المسبقة إرسال استعلامات ومعلمات SQL إلى خادم قاعدة البيانات بشكل منفصل ، مما يسمح لقاعدة البيانات بمعالجة تركيبتها. هذا يمنع محاولات حقن SQL الضارة من خلال ضمان عدم تحليل البيانات بواسطة PHP قبل النقل.
خيارات التنفيذ:
هناك طريقتان رئيسيتان لتنفيذ عبارات المعالجة المسبقة:
PDO (كائن بيانات PHP):
هذا نهج شائع يعمل مع جميع برامج تشغيل قاعدة البيانات المدعومة. فيما يلي مثال على استخدامه:
$ stmt = $ pdo-> إعداد ('حدد * من الموظفين حيث name =: name') ؛ $ stmt-> execute (['name' => $ name]) ؛ foreach ($ stmt as $ row) { // خط المعالجة }
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute([ 'name' => $name ]);
foreach ($stmt as $row) {
// 处理行
}
mysqli (امتداد mysql المحسّن): لقواعد بيانات MySQL ، يمكنك استخدام MySqli. بدءًا من PHP 8.2 ، يمكنك استخدام طريقة execute_query () لإعداد المعلمات وربط وتنفيذ عبارات SQL في خطوة واحدة:
$ result = $ db-> execute_query ('حدد * من الموظفين where name =؟' ، [$ name]) ؛
بينما ($ row = $ result-> fetch_assoc ()) {
// خط المعالجة
}
$result = $db->execute_query('SELECT * FROM employees WHERE name = ?', [$name]);
while ($row = $result->fetch_assoc()) {
// 处理行
}
$ stmt = $ db-> إعداد ('حدد * من الموظفين حيث الاسم =؟') ؛
$ stmt-> bind_param ('s' ، $ name) ؛
$ stmt-> execute () ؛
$ result = $ stmt-> get_result () ؛
بينما ($ row = $ result-> fetch_assoc ()) {
// خط المعالجة
}
$stmt = $db->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name); // 's' 表示'字符串'变量类型
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// 处理行
}
تصحيح إعدادات الاتصال:
]
عند إنشاء اتصال ، من المهم تعطيل محاكاة بيانات المعالجة المسبقة لتحسين الأداء والأمان.
اتصال PDO:
$ dbconnection = new pdo ('mysql: dbname = dbtest ؛ host = 127.0.0.1 ؛ charset = utf8mb4' ، 'user' ، 'password') ؛ $ dbconnection-> setAttribute (pdo :: attr_emulate_prepares ، false) ؛ $ dbconnection-> setAttribute (pdo :: attr_errmode ، pdo :: errmode_exception) ؛
اتصال mysqli:
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8mb4', 'user', 'password');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
ختاماً:
من خلال تنفيذ عبارات المعالجة المسبقة وإعداد الاتصال بشكل صحيح ، يمكنك منع هجمات حقن SQL بشكل فعال وضمان أمان وسلامة تطبيقات قاعدة البيانات الخاصة بك.تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3