منع حقن SQL في PHP

إذا تم إدراج إدخال المستخدم دون تحديد في استعلام SQL ، يصبح التطبيق عرضة لهجمات حقن SQL ، كما في المثال أدناه:

$variable = $_POST['input_utilisateur']; 

mysql_query("تدرج في قيم 'الجدول' ('العمود') ('$variable')")؛
في هذا المثال، يمكن للمستخدم إدخال  < span style = "لون الخلفية: #f3f3f3; عائلة الخط: " ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >القيمة") ؛ إسقاط الجدول الجدول ؛--')< / span> . يصبح الاستعلام:

< pre class = "prettyprint lang-php" >mysql_query ("إدراج في" الجدول "('العمود') القيم ('القيمة'); جدول إسقاط ؛--')
< / pre>
هدف المتسلل هو تعديل استعلام SQL حتى يتمكن من قراءة المعلومات المخفية أو إجراء أي عملية أخرى (قراءة ، تعديل ، حذف). في هذا المثال ، تتم إزالة الجدول من قاعدة البيانات.
هذا النوع من العيوب هو الأكثر انتشارا وخطورة ، وإذا كانت التعليمات البرمجية الخاصة بك غير آمنة ، فسيكون الخطر هائلا.

الحل لعيوب حقن SQL هو استخدام الاستعلامات المعدة أو الاستعلامات ذات المعلمات. التحضير للتنفيذ ، يتم إرسال الاستعلام إلى خادم قاعدة البيانات وإجراء فحص بناء الجملة. باستخدام هذه الطريقة ، من المستحيل على المتسلل حقن SQL.

لهذا ، لديك ثلاثة خيارات:

1- استخدام PDO:

< pre class = "prettyprint lang-php" >$statement = $pdo-> إعداد ("حدد * من المسؤول حيث الاسم =: الاسم") ؛ < / >< / >$statement > تنفيذ (صفيف ("الاسم" = > $nom)) ؛

foreach ($statement ك $row) {
// افعل شيئا
}
< / pre>2- باستخدام MySQLi:

< pre class = "prettyprint lang-php" >$statement = $dbConnection-> إعداد ("حدد * من المسؤول حيث الاسم = ؟") ؛ < / >$statement > bind_param ('s' ، $nom) ؛ < / >< / >$statement > تنفيذ();

$result = $statement-> get_result();
بينما ($row = $result-> fetch_assoc()) {
// افعل شيئا
}
3- استخدام نمط الطريقة < / span >< span style = "عائلة الخط:" ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >< نمط الامتداد = "لون الخلفية: أبيض ؛" >PHP < / span>mysql_real_escape_string< / a>< / span>
PHP لديها طريقتها الخاصة لإصلاح هذه الثغرة الأمنية ، ولكن تجدر الإشارة إلى أن الطريقتين السابقتين أكثر فعالية. < span style = "لون الخلفية: #f3f3f3; عائلة الخط: " ساعي جديد" , " ساعي" ، حافلة صغيرة؛" >mysql_real_escape_string< / سبان>  يأخذ سلسلة سيتم استخدامها في استعلام MySQL ويعيد نفس سلسلة الأحرف التي تم الهروب منها من أي حقن SQL. يتم استبدال الحصص (') ب \'. تتطلب هذه الوظيفة أن تكون متصلا بالفعل بقاعدة البيانات لاستخدامها.

$nom = "' OR 1'"; 

$nom = mysql_real_escape_string ($nom);

$query = "حدد * من المسؤول حيث الاسم = '$nom'";
echo "تم تجنب الحقن: < BR / > ". $query . "< BR / > ";

$name_vul = "'; حذف من المسؤول حيث 1 أو الاسم = '"؛

$name_vul = mysql_real_escape_string ($name_vul) ؛

$query_vul = "حدد * من المسؤول حيث الاسم = '$nom'";
echo "تم تجنب الحقن: < BR / > ". $query_vul;
< / pre>
المراجع:
https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php< / a>