在greenplum中将日志中的password密文显示

明文转密文的逻辑比较容易,这里主要描述新字符串内存如何分配及在哪里分配。

第一步:

exec_simple_querypg_parse_query 之后立刻将 query_string 替换为密文,如果要新分配内存,可用 palloc 直接分配(因为此时的 context 就是 query string 产生的 MessageContext,这个string 是在 PostgreMain 的 ReadCommand(&input_message) 中读到input_message上的)
在这里插入图片描述
query_string指向它的内存在这里插入图片描述
在这里插入图片描述
这里 parse 后的 query 可以先做个判断,因为有些语句在后面还会用到(比如创建表,当然创建表语句中也没有 password)。
还有一点,这里有一个全局变量 debug_query_string,它和这个 query string 指向同一内存,如果之前用 palloc 分配了新字符串内存,那么 debug_query_string 也要指向这个内存。
在这里插入图片描述

第二步

第一步只拦截下了正常的打日志用的 string,但如果 parse 过程中如果出现语法问题会直接报错和写日志,不能被拦截,因此还要在 scan.l 的 scanner_yyerror 函数中拦截错误的发生:
如果要分配新字符串,依然可以直接分配,因为此时 context 还在 MessageContext 中,但此时要多做两件事:

  1. yyextra->scanbuf 调用 pfree 并赋密文后的值:可用 pstrdup 复制一份密文字符串到 yyextra->scanbuf,它是在 raw_parser->scanner_init 中初始化的( 用gdb 可跳转看到),内存与 debug_query_string 不是同一块内存
    在这里插入图片描述
    在这里插入图片描述
  2. 重新更新 loc = yyextra->scanbuf + *yylloc:loc 用来指出出错位置,后面会根据这个位置来打印密文字符,如下图中星号的位置。
    在这里插入图片描述
    日志中表现为
    在这里插入图片描述

第三步

大多数查询是从psql直接进来的,这就有一个前端显示中存在密码的问题,如下:(已隐藏过了)
在这里插入图片描述
这可以在 src/interfaces/libpq/fe-protocol3.c 中
reportErrorPosition 函数的最后把变量替换掉:
将绿色部分改为红色问题(即将要打印的语句替换为********)在这里插入图片描述

参考

日志打印是在 logger 进程中做的,可参考
https://blog.csdn.net/qq_37517281/article/details/106884945
MemoryContext,参考:
https://blog.csdn.net/qq_37517281/article/details/106889643

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值