سؤال

وعذرا لعدم تنسيق قانون بلدي. ذهب شريط الأدوات ...

وأريد أن إدراج بعض البيانات في ديسيبل ماي. لقد كتب وظيفة في بي:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

في عنوان URL-الميدان من بلدي وانا اعرف Browswe استدعاء الدالة من هذا القبيل: http://www.justanexample.com/example.php؟ID=123123123&token= qwertzuiop

وهذا يعمل.

إذا وضعت مساحة في أي واحد من المعلمات على سبيل المثال من هذا القبيل: http://www.justanexample.com/example.php؟ID=123123 123 & رمز = qwertzuiop

تم إضافة شيء إلى بلدي ديسيبل ماي.

وسيكون أمرا رائعا للحصول على بعض المساعدة :) شكرا لك!

هل كانت مفيدة؟

المحلول

وظيفة الخاص بك هو عرضة للحقن SQL. يجب التحقق من صحة كافة معلمات تلقى المستخدم قبل استخدامها في استعلام SQL، وتمرير أي سلاسل من خلال mysql_real_escape_string، لأن ثم أتمكن من تمرير فقط في شيء من هذا القبيل example.php?token='; DROP DATABASE; وملكي المسمار طلبك.

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

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

ويجب أن ننظر أيضا إلى استعلامات parametrized، التي تشكل الكثير من طريقة أفضل للقيام الشاملة الاستفسارات SQL مع المعلمات من مجرد استخدام سلسلة سلسلة. لذلك، تبدو في استخدام التمديد mysqli بدلا من الخلية، أو على مستوى أعلى، شركة تنمية نفط عمان.

نصائح أخرى

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

التحقق

إذا كنت تتوقع <م> ID ليكون أكبر عدد صحيح من الصفر:

if (!ctype_digit($ID)) {
    // invalid ID
}

إذا كنت تتوقع <م> رمز أن تكون سلسلة أبجدية رقمية:

if (!ctype_alnum($token)) {
    // invalid token
}

تصفية

وتصفية وإزالة الأجزاء غير صالحة للمدخلات بحيث يصبح ساري المفعول:

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

الهروب

والهروب هو استبدال الأحرف الفوقية من سياق محدد هو المقصود بعض سلسلة ليتم وضعها في ليستعلم الخلية يجب عليك استخدام وظيفة أن يهرب الأحرف الفوقية للفي السياق <م> إعلان سلسلة في الخلية . PHP لديه mysql_real_escape_string وظيفة لهذا الغرض:

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";

والفضاء إزالة من لهم باستخدام وظيفة str_replace على سبيل المثال:

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

وأيضا، وأظن ID $ الخاص بك هو حقل عدد صحيح في الجدول الخاص بك حتى تتمكن من تشغيل الاستعلام الخاص بك دون تحديد نقلت على سبيل المثال:

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";

والتعليمات البرمجية الخاصة بك هو افتراض الاستعلام يكمل بنجاح دون التحقق من أي وقت مضى إذا كان هناك خطأ. انا التخمين أنه سوف يكون خطأ في بناء الجملة بسبب المسافات. إذا كان حقل ID الخاص بك هو نوع عدد صحيح، ثم القيام ID=123 123 سيكون خطأ في بناء الجملة. بما في ذلك جميع المشورة حقن SQL والبيانات التعقيم في إجابات أخرى، يجب إعادة كتابة وظيفة add_ID على النحو التالي:

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

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

ويمكنك استخدام str_replace إلى المساحات إزالة. ولكنها ليست ممارسة جيدة. كيف يمكن أن يكون URL لتعديل ذلك؟ في الحالات العادية فإنه من غير واقعي. العكس من ذلك، يجب اختبار كل القيم مدخلات من المستخدم (يجب أن يكون ID عدد صحيح، ينبغي رمز لا يحتوي على "" رمز والشيكات الأخرى). قراءة حول SQL-الحقن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top