【原创】MySQL Proxy - query注入动作中的脚本序列

    下图展示了一个如何使用 proxy 将客户端发送过来的 query 注入到 query 队列的例子。因为 proxy 位于客户端和 MySQL 服务器之间,所以经由 proxy 发送到服务器,以及由 proxy 最终返回给客户端的信息,不需要做到完全匹配或者关联。一旦客户端连接到了 proxy ,下图中展现的由客户端发送每一个单独的 query 引起的命令序列将会发生。 

 

       当客户端向 proxy 提交了一个 query 的时候,proxy 内部的 read_query() 函数将会被触发。该函数会添加 query 到 query 队列中。 

       一旦 read_query() 函数执行完毕, query 会按加入队列的顺序向 MySQL 服务器提交。 

       MySQL 服务器会返回由每一个 query 所产生的结果集,每一个提交的 query 对应一个结果集。当结果集到达 proxy 后,read_query_result() 函数会被触发,在每一次触发的时候都可以由我们自己决定哪个结果集需要发送回客户端。 

       例如,你可以向全局 query 队列中添加额外的 query 让服务器来进行处理。可以用于在原始 query 的前后添加获取统计信息的 query 语句的方式对原始 query 进行改变: 

?


1

SELECT * FROM City;

改变为一系列 query: 

?


1

2

3

SELECT NOW();

SELECT * FROM City;

SELECT NOW();

       你同样可以修改原始的语句,例如,向每一条要执行的语句中添加 EXPLAIN 以获取该语句如何被处理的信息,同样也是将原始 query 语句进行改变,变成下面一系列语句: 

?


1

2

SELECT * FROM City;

EXPLAIN SELECT * FROM City;

       在上述两个例子中,客户端将会收到比预期更多的结果集。无论你如何控制进入的 query 以及返回的结果,由 proxy 返回的对应 query 数量的结果集必须要与由客户端原始发送的 query 数目相等。 

       你可以调整客户端代码以便处理由 proxy 返回的多个结果集,但是在大多数情况下,你会希望 proxy 的存在对于客户端来说是透明的。为了保证这一点,query 的数量和结果集的数量应该保持一致,你可以使用 MySQL Proxy 的 read_query_result() 函数来提取额外的结果集信息,以便只返回客户端原始 query 对应的结果集。你可以通过在向 query 队列中添加 query 时,赋予每一个 query 一个唯一的 ID 的方式来保证这点,然后当 read_query_result() 函数 在后续处理中收到结果集时通过匹配该 ID 的方式过滤掉额外的结果集。

时间: 2024-10-26 01:33:37

【原创】MySQL Proxy - query注入动作中的脚本序列的相关文章

【原创】MySQL Proxy - 内部结构

        在 MySQL Proxy 的脚本元素中有一些基本的内部结构需要知道.其中最主要的结构就是 proxy ,其提供了访问贯穿脚本中的许多公共结构的接口,例如连接列表和配置的 backend server .其他结构,例如来自客户端的包和返回的结果集等,只有在具体的脚本函数的上下文环境中才是可以访问的.  下表中描述了 MySQL proxy 脚本元素的公共属性.  Attribute Description connection A structure containing the

【原创】MySQL Proxy中socketpair的使用

      学习 MySQL Proxy 0.8.3 的源码后可知,其全部事件处理线程均对全局 socketpair 的读端进行了监听,以实现通知管道的功能:threads->event_notify_fds[0] .  ? 1 2 3 4 5 6 7 8 9 10 11 12 13 int chassis_event_threads_init_thread(chassis_event_threads_t *threads, chassis_event_thread_t *event_threa

【原创】MySQL Proxy - 脚本

       你可以通过使用嵌入式 Lua 脚本语言对 MySQL Proxy 的行为进行控制,以使得其能够对发送给 MySQL 服务器的 query 和 response 进行操纵.  下图展现了 MySQL Proxy 中使用的类的总览.           在 MySQL Proxy 和服务器之间的主要交互功能是通过 Lua 脚本定义的一个或者多个函数.根据客户端与一个或者多个 backend MySQL servers 之间通信序列中不同的事件和操作,定义如下一些关键函数:  conne

【原创】MySQL Proxy - 概况

       MySQL Proxy 是一种在网络上使用 MySQL 网络协议进行通信的应用,提供了一或多个 MySQL server 与一或多个 MySQL client 之间的通信功能.由于 MySQL Proxy 使用的是 MySQL 网络协议,故其可以在不做任何修改的情况下,配合任何符合该协议的且与 MySQL 兼容的客户端一起使用.这其中也包括 MySQL 的命令行客户端,任何使用了 MySQL 客户端库的客户端,以及任何支持 MySQL 网络协议的连接器(connector).   

MySQL Proxy(解决注入的另一思路)_漏洞研究

作者:云舒 What is MySQL Proxy? MySQL Proxy is a simple program that sits between your client and MySQL server(s) that can monitor, analyze or transform their communication. Its flexibility allows for unlimited uses; common ones include: load balancing; f

【原创】MySQL Proxy - 底层实现篇

底层实现篇(chassis)     [ Configfile and Commandline Options]           glib2 提供了 config-file 解析和 command-line option 解析功能. 其提供了将 option 以相同方式暴露给调用者的方法,以及从 Configfile 和 Commandline 获取 option 的功能.    所有 option 的解析过程都可以分为三步: 1. 提取   command-line 上的 basic op

【原创】MySQL Proxy - 核心篇

核心层篇(Core)          Network Core 构建于 socket 处理实现的基础之上,将 client connection 和 server connection 关联到一起.     [Connection Life Cycle]    connection 可处于下面 4 种协议基本 phase 之一:    connect authentification query disconnect        通过对 plugin 功能的定制实现,可以改变 network

原创】MySQL Proxy - 架构篇

架构篇(architecture)         MySQL Proxy 的定位是存在于 mysql client 和 mysql server 之间的一个简单的程序,能够对从其上通过的数据进行检查.转换和直接进行相应操作.  应用范围包括:  负载均衡(load balancing) 故障处理(fail over) 查询追踪(query tracking) 查询分析(query analysis) (...)        内部实现上讲,MySQL Proxy 是这样的一个协议栈:  (应该

【原创】MySQL Proxy - 命令行选项

       直接从命令行上启动 MySQL Proxy :  ? 1 shell> mysql-proxy        在大多数情况下,你至少应该确定 MySQL Proxy 应该将 query 转发到哪个 backend MySQL server ,即需要指定其 host 名或地址,以及端口号信息.         可以在命令行中直接指定选项,也可以在配置文件中指定,同时使用 --defaults-file 命令行参数指定配置文件的位置.         如果你采用了配置文件的方式,其格式