mysql_real_escape_string () لكامل $ _request ، أو تحتاج إلى حلقة من خلاله؟

StackOverflow https://stackoverflow.com/questions/4223028

سؤال

هل هناك طريقة أسهل لاستخراج المتغيرات المقدمة بأمان بخلاف ما يلي؟

if(isset($_REQUEST['kkld'])) $kkld=mysql_real_escape_string($_REQUEST['kkld']);
if(isset($_REQUEST['info'])) $info=mysql_real_escape_string($_REQUEST['info']);
if(isset($_REQUEST['freq'])) $freq=mysql_real_escape_string($_REQUEST['freq']);

(و: هل تستخدم isset() في هذا السياق؟)

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

المحلول

للهروب من جميع المتغيرات في واحدة:

$escapedGet = array_map('mysql_real_escape_string', $_GET);

ل مقتطف جميع المتغيرات في مساحة الاسم الحالية (أي $foo = $_GET['foo']):

extract($escapedGet);

من فضلك لا تفعل هذه الخطوة الأخيرة رغم ذلك. ليست هناك حاجة ، فقط اترك القيم في صفيف. يمكن أن يؤدي استخراج المتغيرات إلى اشتباكات الأسماء والكتابة فوق المتغيرات الحالية ، والتي ليست مجرد متاعب ومصدر للخشب ولكن أيضًا مخاطر أمان. أيضا ، كما يقول foltclock ، التزم بـ $_GET أو $_POST. أيضا 2 ، كما يشير Zerkms ، ليس هناك فائدة mysql_real_escaping المتغيرات التي ليس من المفترض استخدامها في استعلام قاعدة البيانات ، قد تؤدي إلى المزيد من المشكلات.


لاحظ ذلك حقًا لا أحد من هذه فكرة جيدة بشكل خاص على الإطلاق ، فأنت مجرد تناسخ Magic_Quotes و Global_vars ، والتي كانت ممارسات PHP فظيعة منذ العصور الماضية. استخدم عبارات معدّة مع معلمات ملزمة عبر mysqli أو pdo واستخدم القيم من خلال $_GET أو filter_input. يرى http://www.phptherightway.com.

نصائح أخرى

يمكنك أيضًا استخدام وظيفة متكررة مثل هذه لإنجاز ذلك

function sanitate($array) {
   foreach($array as $key=>$value) {
      if(is_array($value)) { sanitate($value); }
      else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);

بقدر ما أشعر بالقلق من Starx 'و Ryan إجابة Ryan من 19 نوفمبر '10 هو أفضل حل هنا حيث كنت بحاجة إلى ذلك أيضًا.

عندما يكون لديك حقول إدخال متعددة تحمل اسمًا واحدًا (أسماء مثل []) ، مما يعني أنه سيتم حفظها في صفيف داخل $ _post-array ، يجب عليك استخدام وظيفة عودية ، حيث لا يعمل mysql_real_escape_string في المصفوفات.

لذلك هذا هو الحل الوحيد للهروب من مثل هذا المتغير $ _post.

function sanitate($array) {
    foreach($array as $key=>$value) {
        if(is_array($value)) { sanitate($value); }
            else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);

لتطهير أو التحقق من صحة أي INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, ، أو INPUT_ENV, ، يمكنك استخدام

  • filter_input_array - يحصل على متغيرات خارجية وترشيحها اختياريًا

يمكن إجراء التصفية باستخدام رد الاتصال ، حتى تتمكن من توفيرها mysql_real_escape_string.

هذه الطريقة لا تسمح بالتصفية ل $_REQUEST, ، لان يجب ألا تعمل مع $_REQUEST عندما تكون البيانات متوفرة في أي من glglobals الأخرى. من المحتمل أن تكون غير آمنة.

تتطلب منك الطريقة أيضًا تسمية مفاتيح الإدخال ، لذلك فهي ليست تصفية دفعة عامة. إذا كنت تريد تصفية دفعة عامة ، فاستخدم array_map أو array_walk أو array_filter كما هو موضح في مكان آخر على هذه الصفحة.

أيضًا ، لماذا تستخدم امتداد MySQL القديم بدلاً من Mysqli (أنا لتحسين) التمديد. سوف يمنحك امتداد mysqli الدعم المعاملات, التجانس و بيانات معد (مما يلغي الحاجة إلى الهروب) جميع الميزات التي يمكن أن تجعل رمز DB أكثر موثوقية وأمان.

إذا كنت تستخدم Mysqli الامتداد وترغب في الهروب من جميع المتغيرات:

$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);

كبديل ، يمكنني أن أنصحك بالاستخدام مرشحات المدخلات PHP7, ، والذي يوفر اختصار للهروب من SQL. لا أوصي به في حد ذاته ، لكنه يقطع الغيار إنشاء متغيرات محلية:

 $_REQUEST->sql['kkld']

التي يمكن استخدامها مضمّنًا في سلاسل استعلام SQL ، وإعطاء تحذير إضافي إذا نسيت ذلك:

 mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");

إنه أمر مشكوك فيه بشكل نحلي ، ولكنه يسمح لك بالهروب فقط من تلك المتغيرات التي تحتاجها حقًا. أو لمحاكاة ما طلبته ، استخدم $_REQUEST->sql->always();

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