摘要:Hook,wiki说明文档:
hook实际上就是static 的函数指针.hook工作原理:每一个hook是由一个全局性的函数指针构成的。服务端进行运行初始化其为NULL,当数据库必须调用的时候,首先会检测是否为NULL,不是则优先调用函数,否则执行标准函数。
设置函数指针:当数据库载入共享库时,首先会将其载入到内存中,然后执行一个函数调用_PG_init。这个函数存在大多数共享库中是有效的。所以我们可以通过这个函数来加载我们自己的hook。
取消函数指针设置:当数据库需要卸载其共享库时,会调用函数 _PG_fini() 。我们可以再此进行设置函数指针为NULL,这样就取消设置了
hook可以修改和中断用户的操作。
下面是常用hook列表,大家可以根据列表进行对数据库相关过程进行修改,不需要直接在PG源码下修改,仅需要加一个扩展组件即可。
Hook | 初始版本 | 说明 |
check_password_hook | 9.0 | 处理用户密码时调用的hook,可以对用户的密码进行限制,增加密码的规范。 |
ClientAuthentication_hook | 9.1 | 处理连接时调用的hook,可以对连接进行管理。 |
ExecutorStart_hook | 8.4 | 处理查询执行开始时调用的hook |
ExecutorRun_hook | 8.4 | 处理查询执行时调用的hook |
ExecutorFinish_hook | 8.4 | 处理查询结束时调用的hook |
ExecutorEnd_hook | 8.4 | 处理查询完成后调用的hook |
ExecutorCheckPerms_hook | 9.1 | 处理访问权限时调用的hook |
ProcessUtility_hook | 9.0 | 通用hook,可以处理很多的过程,。 |