Phantom-SQL-Abfragen

Schauen Sie sich den PHP-Code an:

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

Ein solcher Code kann eine UPDATE- oder INSERT-SQL-Abfrage provozieren oder nicht, wenn bereits identische Daten in der Datenbank installiert sind, weshalb diese Funktionalität als Phantom-SQL-Abfragen bezeichnet wird. Eine ähnliche Funktionalität ist normalerweise in den meisten CRMs vorhanden. Schauen wir uns jedoch an, wie sie ohne CRM implementiert werden kann. Phantomanfragen können in Webanwendungen häufig verwendet werden, insbesondere in Bezug auf Konfigurationen. Ein typischer (aber nicht notwendiger) Algorithmus besteht aus drei Schritten: Lesen von Daten aus der Datenbank, möglicherweise mehrmaliges Ändern von Daten und Generieren von echten SQL-Abfragen zum Aktualisieren der Daten in der Datenbank. Lassen Sie uns die Details herausfinden ...

Insgesamt müssen Sie drei Methoden haben, eine für jede Stufe. Ich werde den Code der ersten Methode angeben, mit der die aus der Datenbank gelesenen Daten vollständig entpackt werden, da dies recht einfach ist:

 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]; } 

Methodeneingabeparameter:

  • $ char - Ein kleiner Buchstabe des englischen Alphabets gibt die Art der Funktionalität von Phantomabfragen an und kann wie im obigen Beispiel in variablen Präfixen verwendet werden.
  • $ original - Der Textinhalt der Datenbankzelle (`mediumtext` für MySQL), in der alle Variablen der Phantomabfragen $ char in großen Mengen gespeichert sind. Es kann auch eine leere Zeichenfolge eingegeben werden.
  • $ sql - eine Abfragevorlage, die zum Generieren einer echten SQL-Abfrage verwendet wird, z. B. in einer Rückruffunktion für register_shutdown_function ();
  • $ flag - die Flagge. Häufiger wird ein vordefinierter Wert von 0 verwendet.

Es gibt zwei Arten von Abfragevorlagen, die auf den Funktionen sql (..) oder sqlf (..) basieren. Ich werde den zweiten Code vollständig angeben, da er bei korrekter Verwendung die Unmöglichkeit der SQL-Injection garantiert und schnell und recht einfach ist:

 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); } 

Leider ist die Funktion sqlf () nicht universell, um beliebige SQL-Abfragen zum Schutz vor Injektion zu kompilieren. Aufgrund der relativ hohen Betriebsgeschwindigkeit existiert es jedoch parallel zur universellen Funktion sql (). Vorlagen für sqlf () werden für den Fall verwendet, dass nur mit einer Mediumtextzelle gearbeitet wird. Die zweite Vorlage wird verwendet, wenn Sie solche ausstehenden Abfragen für viele Spalten der Tabelle organisieren müssen.

Wie ist die Verarbeitung des angegebenen PHP-Codes ganz am Anfang des Artikels


Die Variable $ user enthält einen Zeiger auf ein USER-Objekt, das wiederum die magischen Methoden __get () und __set () enthält. Unter dem Präfix v_ versteht die Klasse, dass sie in die Sitzungstabelle "Besucher" schreibt, und ruft die Methode SKY :: save (..) auf, mit der der Code im Array SKY :: $ mem gespeichert wird. Am Ende des Skripts wird die Rückruffunktion für register_shutdown_function () aufgerufen, in der die eigentliche SQL-Abfrage in der Datenbank tatsächlich ausgeführt wird (oder nicht).

Die beiden anderen Methoden, die zum Organisieren der Funktion erforderlich sind, sind SKY :: save (..) und SKY :: here (..). Der erste speichert die Daten in einem Array und der zweite generiert und führt eine echte Abfrage in der Datenbank durch.

Der Coresky-Code (wiederverwendbares Framework oder CMF-Code) verwendet 8 Arten von Phantom-SQL:

  • Systemkonfiguration, die in der Datenbank gespeichert ist;
  • Besucherkonfiguration
  • Konfiguration autorisierter Benutzer;
  • Systemkonfiguration des Admin-Panels;
  • Systemkonfiguration von Konsolenstarts;
  • Zum Organisieren des Dienstprogramms i18n werden drei Arten von Phantom-SQL verwendet.

Wie Sie sehen können, ist „Phantom SQL“ für fast alle Webanwendungen relevant.

Vorteile der beschriebenen Funktionalität


  • Sie müssen ALTER TABLE ... (oder INSERT new rows) nicht ausführen, um während der Entwicklung der Anwendung neue Konfigurationsvariablen hinzuzufügen. Sie können neue Variablen einfach in PHP-Code einfügen, ohne die Datenbankstruktur zu ändern.
  • Die Funktionalität kann die Anzahl der Datenbankabfragen auf eins reduzieren, wenn sich ein Datensatz in derselben Zeile derselben Tabelle befindet.

Nachteil


Bei Ghost-SQL-Variablen können Sie keine Indizes „verschrauben“. Höchstwahrscheinlich können Sie LOCK TABLE nicht erstellen oder andere erweiterte MySQL-Funktionen verwenden.

Weitere Informationen finden Sie auf der SKY-Projektwebsite.

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


All Articles