ファントムSQLクエリ

PHPコードを見てください。



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





このようなコードは、UPDATEまたはINSERT SQLクエリを引き起こす可能性があります。または、同じデータが既にデータベースにインストールされている場合、この機能はPhantom SQLクエリと呼ばれます。 通常、ほとんどのCRMに同様の機能がありますが、CRMなしでどのように実装できるかを見てみましょう。 Phantomリクエストは、特に設定に関して、Webアプリケーションで非常に広く使用される可能性があります。 典型的な(ただし必須ではない)アルゴリズムは、データベースからのデータの読み取り、データの変更(場合によっては複数回)、およびデータベース内のデータを更新するための実際のSQLクエリの生成の3段階で進みます。 詳細を見てみましょう...



合計で、各ステージに1つずつ、合計3つのメソッドが必要です。 データベースから読み取ったデータを完全にアンパックする最初のメソッドのコードを示します。これは非常に単純なためです。



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





メソッド入力パラメーター:





クエリテンプレートには、関数sql(..)またはsqlf(..)に基づいた2つのタイプがあります。 2番目のコードを完全に提供します。正しく使用すると、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()のテンプレートは、1つのmediumtextセルのみで作業する場合に使用されます。 2番目のテンプレートは、テーブルの多くの列に対してこのような保留中のクエリを整理する必要がある場合に使用されます。



記事の冒頭で、指定されたPHPコードの処理はどうですか



$ユーザー変数には、USERオブジェクトへのポインターが含まれています。USERオブジェクトには、__ get()および__set()というマジックメソッドがあります。 プレフィックスv_により、クラスは、 `visitors`セッションテーブルに書き込みを行っていることを理解し、SKY :: save(..)メソッドを呼び出します。このメソッドは、コードをSKY :: $ mem配列に保存します。 スクリプトの最後に、register_shutdown_function()のコールバック関数が呼び出され、データベース内の実際のSQLクエリが実際に実行されます(または実行されません)。



したがって、機能の編成に必要な他の2つの方法は、SKY :: save(..)およびSKY :: here(..)です。 1つ目はデータを配列に格納し、2つ目はデータベースで実際のクエリを生成して実行します。



coreskyコード(再利用可能なコードフレームワークまたはCMF)は、8種類のファントムSQLを使用します。





ご覧のとおり、「ファントムSQL」はほとんどすべてのWebアプリケーションに関連しています。



説明されている機能の利点





欠点



ゴーストSQL変数の場合、インデックスを「ねじ込む」ことはできません;ほとんどの場合、LOCK TABLEを作成したり、他の高度なMySQL機能を使用したりすることはできません。



詳細については、SKYプロジェクトのWebサイトをご覧ください。



All Articles