博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】MySQL Proxy - query注入动作中的脚本序列
阅读量:5880 次
发布时间:2019-06-19

本文共 1174 字,大约阅读时间需要 3 分钟。

    下图展示了一个如何使用 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 的方式过滤掉额外的结果集。

转载地址:http://vbjix.baihongyu.com/

你可能感兴趣的文章
SQL语句的执行过程
查看>>
Silverlight开发历程—动画(线性动画)
查看>>
详解Linux中Load average负载
查看>>
HTTP 协议 Cache-Control 头——性能啊~~~
查看>>
丢包补偿技术概述
查看>>
PHP遍历文件夹及子文件夹所有文件
查看>>
WinForm程序中两份mdf文件问题的解决
查看>>
程序计数器、反汇编工具
查看>>
Android N: jack server failed
查看>>
如何将lotus 通讯簿导入到outlook 2003中
查看>>
WinForm 应用程序中开启新的进程及控制
查看>>
js replace,正则截取字符串内容
查看>>
Thinkphp5笔记三:创建基类
查看>>
查询反模式 - GroupBy、HAVING的理解
查看>>
Android中EditText,Button等控件的设置
查看>>
TextKit简单示例
查看>>
网格最短路径算法(Dijkstra & Fast Marching)(转)
查看>>
软链接和硬链接详解
查看>>
Redis_master-slave模式
查看>>
3.使用Maven构建Web项目
查看>>