幻影SQL查询

看一下PHP代码:

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

这样的代码可能会引发UPDATE或INSERT SQL查询,或者可能不会引发数据库中是否已经安装了相同的数据,这就是为什么将此功能称为Phantom SQL查询的原因。 大多数CRM中通常都具有类似的功能,但让我们看一下如何在没有CRM的情况下实现该功能。 虚拟请求有可能在Web应用程序中被广泛使用,尤其是在配置方面。 典型(但不是必需)的算法分三个阶段进行:从数据库中读取数据,可能多次更改数据以及生成实际的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-数据库单元的文本内容(对于MySQL为`mediumtext`),其中幻象查询的所有变量$ char均批量存储。 也可以输入一个空字符串。
  • $ sql-一个查询模板,将用于生成实际的SQL查询,例如,在register_shutdown_function()的回调函数中;
  • $ flag-标志。 通常,使用预定义值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); } 

不幸的是,就防止注入而言,就编译任意SQL查询而言,sqlf()函数并不通用。 但是,由于操作速度相对较高,它与通用sql()函数并行存在。 sqlf()的模板用于仅使用一个中文本单元格的情况。 当您需要为表的许多列组织此类挂起的查询时,使用第二个模板。

在本文的开头如何处理指定的PHP代码


$ user变量包含一个指向USER对象的指针,该对象又具有魔术方法__get()和__set()。 通过前缀v_,该类了解到它正在写入`visitors'会话表,并调用SKY :: save(..)方法,该方法将代码保存在SKY :: $ mem数组中。 在脚本的末尾,调用register_shutdown_function()的回调函数,在该回调函数中实际执行(或不执行)数据库中的实际SQL查询。

因此,组织功能所需的其他两种方法是SKY :: save(..)和SKY :: here(..)。 第一个将数据存储在数组中,第二个在数据库中生成并执行实际查询。

coresky代码(可重用框架或CMF代码)使用8种类型的幻像SQL:

  • 系统配置,存储在数据库中;
  • 访客配置
  • 配置授权用户;
  • 管理面板的系统配置;
  • 控制台启动的系统配置;
  • 三种类型的幻像SQL用于组织i18n实用程序;

如您所见,“虚拟SQL”与几乎所有Web应用程序都相关。

所描述功能的优势


  • 在应用程序开发时,无需执行ALTER TABLE ...(或INSERT新行)来添加新的配置变量。 您可以简单地在PHP代码中添加新变量,而无需更改数据库结构。
  • 对于同一表的同一行中有记录的情况,该功能可以将数据库查询的数量减少到一个。

劣势


对于幽灵SQL变量,您无法“拧入”索引;最有可能的是,您无法制作LOCK TABLE或使用其他高级MySQL功能。

可以在SKY项目网站上找到更多信息

Source: https://habr.com/ru/post/zh-CN451034/


All Articles