博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】MySQL Proxy - read_query_result()
阅读量:6572 次
发布时间:2019-06-24

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

hot3.png

【】
       read_query_result() 函数仅在你之前手动向 query 队列中添加了 query 的情况下,有结果集从服务器端返回的时候被调用。如果你没有对 query 队列进行过操作,该函数不会被调用。该函数仅具有一个入参,即结果包(在 Lua 脚本中可以认为该包对应的是 Injection 结构),其中包含了一系列属性:
  • id: 结果集 ID ,其对应于 当 query 包被客户端向服务器提交时使用 append(id) 函数对 query 队列操作时设置的 ID 值。你必须设置 resultset_is_needed 标志,以便当拦截到来自于服务器的返回结果集时,进行相应处理,之后再返回给客户端。参阅 proxy.queries 。
  • query: 原始 query 的文本内容。
  • query_time: 从 query 被发送到服务器,到接收到结果集的第一行时,所需要的微秒数。
  • response_time: 从 query 被发送到服务器,到接收到结果集的最后一行时,所需要的微秒数。
  • resultset: 结果集数据的内容。
       通过对来自 MySQL 服务器的返回结果信息的分析处理,可以提取出与你之前注入的 query 语句匹配的结果,并返回修改后的结果集(例如返回一个经过修改的 query 产生的结果),甚至创建属于你自己的结果集。
       下面的 Lua 脚本,将输出每一个发送到服务器的 query 对应的文本内容,以及 query 时间和 response 时间(即开始执行 query 的时刻和返回该 query 结果的时刻):
function read_query( packet )        if packet:byte() == proxy.COM_QUERY then                print("we got a normal query: " .. packet:sub(2))                proxy.queries:append(1, packet )                return proxy.PROXY_SEND_QUERY        endendfunction read_query_result(inj)        print("query-time: " .. (inj.query_time / 1000) .. "ms")        print("response-time: " .. (inj.response_time / 1000) .. "ms")end
       你可以通过 read_query_result() 函数获得返回结果中的 resultset 属性的 row 属性。例如,你可以使用下面的 Lua 代码段来递归显示返回结果中所有行的第一列内容:
for row in inj.resultset.rows do        print("injected query returned: " .. row[1])end
       正如 read_query() 函数一样,read_query_result() 函数能够根据返回结果的内容,按需返回结果的不同值。例如,如果你之前注入了额外的 query 到 query 队列中,然后在获取返回的结果集后,移除与额外 query 对应的结果,仅返回与客户端发送的原始 query 对应的结果。
       下面的例子注入额外的 SELECT NOW() 语句到 query 队列中,并设置了一个与原始 query 不同的 ID 值。在 read_query_result() 函数中,如果发现了与我们自己注入的 query 的 ID 相匹配的结果,我们将显示结果的行内容,然后通过 return proxy.PROXY_IGNORE_RESULT 语句使该结果不会被返回给客户端。如果结果是由任何其他 query 产生,则打印出 query 相应的时间信息,并返回默认值,即返回不做任何修改的结果集给客户端。我们同样可以显式地使用 return proxy.PROXY_IGNORE_RESULT 来将结果返回给 MySQL 客户端。
function read_query( packet )        if packet:byte() == proxy.COM_QUERY then                proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SELECT NOW()", {resultset_is_needed = true} )                proxy.queries:append(1, packet, {resultset_is_needed = true})                proxy.queries:append(2, string.char(proxy.COM_QUERY) .. "SELECT NOW()", {resultset_is_needed = true} )                return proxy.PROXY_SEND_QUERY        endendfunction read_query_result(inj)        if inj.id == 2 then                for row in inj.resultset.rows do                        print("injected query returned: " .. row[1])                end                return proxy.PROXY_IGNORE_RESULT        else                print("query-time: " .. (inj.query_time / 1000) .. "ms")                print("response-time: " .. (inj.response_time / 1000) .. "ms")        endend

转载于:https://my.oschina.net/moooofly/blog/111773

你可能感兴趣的文章
每日一记--cookie
查看>>
约瑟夫环
查看>>
S5:桥接模式 Bridge
查看>>
线程池-Executors
查看>>
WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...
查看>>
FLUSH TABLES WITH READ LOCK 和 LOCK TABLES比较
查看>>
MySQL:创建、修改和删除表
查看>>
Java多线程程序设计详细解析
查看>>
IOS 7 Study - UISegmentedControl
查看>>
八、通用类型系统
查看>>
JQuery的ajaxFileUpload的使用
查看>>
Java分享笔记:使用keySet方法获取Map集合中的元素
查看>>
Java面向对象练习题之人员信息
查看>>
关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法...
查看>>
python之sys模块详解
查看>>
ios 控制器的生命周期
查看>>
C#动态代理
查看>>
认证 (authentication) 和授权 (authorization) 的区别
查看>>
使用 sessionStorage 创建一个本地存储的 name/value
查看>>
POJ2127 LICS模板
查看>>