استعلامات SQL الوهمية

ألق نظرة على كود PHP:

$user->v_useragent = 'coresky.agent'; 

قد يثير هذا الرمز استعلام UPDATE أو INSERT SQL ، أو قد لا يستفز إذا كانت البيانات المتطابقة مثبتة بالفعل في قاعدة البيانات ، وهذا هو السبب في أن هذه الوظيفة تسمى استعلامات Phantom SQL. عادةً ما توجد وظيفة مماثلة في معظم CRMs ، ولكن دعونا نلقي نظرة على كيفية تنفيذها بدون CRM. تتمتع طلبات Phantom بإمكانية استخدامها على نطاق واسع في تطبيقات الويب ، خاصة فيما يتعلق بالتكوينات. تتم متابعة خوارزمية نموذجية (ولكن ليست ضرورية) على ثلاث مراحل: قراءة البيانات من قاعدة البيانات ، وتغيير البيانات ، وربما عدة مرات ، وإنشاء استعلامات SQL حقيقية لتحديث البيانات في قاعدة البيانات. دعونا معرفة التفاصيل ...

في المجموع ، يجب أن يكون لديك ثلاث طرق ، واحدة لكل مرحلة. سأقدم رمز الطريقة الأولى التي تقوم بفك حزم البيانات المقروءة من قاعدة البيانات تمامًا ، لأنها بسيطة جدًا:

 class SKY //    coresky { ... static function &ghost($char, $original, $sql = '', $flag = 0) { SKY::$mem[$char] = [$flag, $flag & 4 ? null : $original, $sql, []]; if ($sql) trace('GHOST SQL: ' . (is_array($sql) ? end($sql) : $sql), false, 1); if ($original) foreach (explode("\n", unl($original)) as $v) { list($k, $v) = explode(' ', $v, 2); SKY::$mem[$char][3][$k] = unescape($v, true); } return SKY::$mem[$char][3]; } 

معلمات طريقة الإدخال:

  • $ char - حرف صغير من الأبجدية الإنجليزية ، يشير إلى نوع وظيفة الاستعلامات الوهمية ، ويمكن استخدامه في بادئات متغيرة ، كما في المثال أعلاه ؛
  • $ original - المحتوى النصي لخلية قاعدة البيانات (`mediumtext` لـ MySQL) ، حيث يتم تخزين جميع متغيرات الاستعلامات الوهمية $ char بكميات كبيرة. سلسلة فارغة قد تكون مدخلات
  • $ sql - قالب استعلام سيتم استخدامه لإنشاء استعلام SQL حقيقي ، على سبيل المثال ، في وظيفة رد اتصال من أجل register_shutdown_function () ؛
  • العلم $ - العلم. في كثير من الأحيان ، يتم استخدام قيمة محددة مسبقا من 0 ؛

يمكن أن تكون قوالب الاستعلام من نوعين ، استنادًا إلى وظائف sql (..) أو sqlf (..). سأقدم الكود الثاني تمامًا ، لأنه ، عند استخدامه بشكل صحيح ، يضمن استحالة حقن SQL ، فهو سريع وبسيط للغاية:

 function sqlf() { # quick parsing, using printf syntax. No SQL injection! $in = func_get_args(); $tpl = array_shift($in); if ($pos = strpos($tpl, '$')) $tpl = preg_replace('/\$_(\w+)/', T_PREFIX . '$1', $tpl); $sql = vsprintf($tpl, array_map(function ($a) { if (!is_array($a)) return is_num($a) ? $a : escape($a); # escape ALL if not numeric return implode(', ', array_map(function ($v) { return is_num($v) ? $v : escape($v); # escape ALL if not numeric }, $a)); }, $in)); return sql(1, $sql); } 

لسوء الحظ ، فإن وظيفة sqlf () ليست عالمية من حيث تجميع استعلامات SQL التعسفية من حيث الحماية ضد الحقن. ومع ذلك ، فإنه موجود بالتوازي مع الدالة sql () الشاملة ، نظرًا لسرعة التشغيل العالية نسبيًا. يتم استخدام قوالب sqlf () لحالة العمل مع خلية نصية واحدة فقط. يتم استخدام القالب الثاني عندما تحتاج إلى تنظيم مثل هذه الاستعلامات المعلقة للعديد من أعمدة الجدول.

كيف يتم معالجة كود PHP المحدد في بداية المقال


يحتوي متغير المستخدم $ على مؤشر لكائن USER ، والذي بدوره يحتوي على الأساليب السحرية __get () و __set (). بواسطة البادئة v_ ، يفهم الفصل أنه يكتب إلى جدول جلسة الزوار ويستدعي الأسلوب SKY :: save (..) ، الذي يحفظ الكود في صفيف SKY :: $ mem. في نهاية البرنامج النصي ، يتم استدعاء وظيفة رد الاتصال لـ register_shutdown_function () ، حيث يتم بالفعل تنفيذ استعلام SQL الفعلي في قاعدة البيانات (أو لا).

لذلك ، الطرق الأخرى الضرورية لتنظيم الوظيفية هي SKY :: save (..) و SKY :: here (..). يقوم الأول بتخزين البيانات في صفيف ، ويقوم الثاني بإنشاء وتنفيذ استعلام حقيقي في قاعدة البيانات.

يستخدم كود coresky (إطار قابل لإعادة الاستخدام أو كود CMF) 8 أنواع من SQL الوهمية:

  • تكوين النظام ، الذي يتم تخزينه في قاعدة البيانات ؛
  • تكوين الزائر
  • تكوين المستخدمين المعتمدين ؛
  • تكوين نظام لوحة الادارة ؛
  • تكوين نظام تطلق وحدة التحكم ؛
  • يتم استخدام ثلاثة أنواع من SQL الوهمية لتنظيم الأداة المساعدة i18n؛

كما ترى ، فإن "phantom SQL" مناسب لجميع تطبيقات الويب تقريبًا.

مزايا الوظيفة الموصوفة


  • لا حاجة للقيام بـ ALTER TABLE ... (أو إدراج صفوف جديدة) لإضافة متغيرات تكوين جديدة أثناء تطوير التطبيق. يمكنك إضافة متغيرات جديدة ببساطة في كود PHP دون تغيير هيكل قاعدة البيانات ؛
  • يمكن أن تقلل الوظيفة عدد استعلامات قاعدة البيانات إلى واحد ، للحالة عندما يكون هناك سجل في نفس الصف من نفس الجدول ؛

عيب


بالنسبة لمتغيرات SQL الخفية ، لا يمكنك "فك" الفهارس ؛ على الأرجح ، لا يمكنك جعل LOCK TABLE أو استخدام ميزات MySQL المتقدمة الأخرى.

يمكن الاطلاع على مزيد من المعلومات على موقع مشروع SKY.

Source: https://habr.com/ru/post/ar451034/


All Articles