Python 获取 SQL 指纹和 HASH 值

news2024/10/8 13:20:47

前言

本文介绍一个提取 SQL 指纹的方法,就是将 SQL 语句的条件转换为 ?可用于脱敏和 SQL 聚类分析的场景。

1. 工具安装

这里用到的工具,就是 pt 工具集中的 pt-fingerprint 含在 Percona Toolkit 中,安装方法可参考 Percona Toolkit Install 这篇文章的 1.1 小节。

2. 实验案例

测试一个简单的 SQL:

pt-fingerprint --query "select a, b, c from users where id = 500"

输出:
select a, b, c from users where id = ?

复杂的长 SQL 建议使用文件的方式,否则会出现一些预期之外的问题,另外 SQL 中不能包含 # – 这些注释符号。

pt-fingerprint select.sql

3. Python 组合分析

代码中的 command_bin_path 就是 pt-fingerprint 的路径,可使用 which 命令查看,

# -*- encoding: utf-8 -*-
import os
import uuid
import time
import hashlib
import subprocess

# which pt-fingerprint
command_bin_path = "/usr/local/bin/pt-fingerprint"


def get_sql_hash(sql_query: str):
    sql_info = ' '.join(sql_query.split())
    sql_hash = hashlib.md5(sql_info.encode()).hexdigest()
    return sql_hash


def exec_dos_command(command):
    """
    Execute system commands.
    """
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE,
                               stderr=subprocess.STDOUT)
    content = process.stdout.read()
    process.communicate()

    if process.returncode != 0:
        print('Program Error: {0}'.format(command))
        print(content)
        sys.exit(0)
    else:
        return content.decode()


def get_sql_fingerprint(sql_text):
    """
    输出 SQL 语句,返回指纹化的 SQL 语句和 SQL HASH
    """
    timestamp_ns = time.time_ns()

    uuid_str = str(uuid.uuid4())[:16]

    file_name = f"{timestamp_ns}_{uuid_str}" + '.sql'

    with open(file_name, 'w') as w1:
        w1.write(sql_text)

    dos_command = command_bin_path + ' ' + file_name

    content = exec_dos_command(dos_command)

    sql_hash = get_sql_hash(content)

    os.remove(file_name)

    return content, sql_hash


sql1 = "select * from tb_user where id = 10;"
sql2 = "select * from tb_user where id = 11;"
sql3 = "select * from tb_user where id = 13;"
sql4 = "select * from tb_user where id = 14;"
sql5 = "select * from tb_user where id = 1576;"
sql6 = "select * from tb_user where id = 19;"

print(get_sql_fingerprint(sql1))
print(get_sql_fingerprint(sql2))
print(get_sql_fingerprint(sql3))
print(get_sql_fingerprint(sql4))
print(get_sql_fingerprint(sql5))
print(get_sql_fingerprint(sql6))

输出:

('select * from tb_user where id = ?;\n', 'ea72157cdf3e46c55792f49d01d1ce19')
('select * from tb_user where id = ?;\n', 'ea72157cdf3e46c55792f49d01d1ce19')
('select * from tb_user where id = ?;\n', 'ea72157cdf3e46c55792f49d01d1ce19')
('select * from tb_user where id = ?;\n', 'ea72157cdf3e46c55792f49d01d1ce19')
('select * from tb_user where id = ?;\n', 'ea72157cdf3e46c55792f49d01d1ce19')
('select * from tb_user where id = ?;\n', 'ea72157cdf3e46c55792f49d01d1ce19')

提供了将 sql 转换为指纹和 sql hash 的函数,大家可以将此定制到自己的代码和功能中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1917368.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【操作系统】手把手带你搭建DNS服务器!

DNS服务器 DNS服务器指域名系统或者域名服务。域名系统为Internet上的主机分配域名地址和IP地址,用户使用域名地址,该系统就会自动把域名地址转为IP地址。域名服务是运行域名系统的Internet工具。执行域名服务的服务器称之为DNS服务器,通过DN…

在创建jsp项目中解决无法连接数据库以及junit问题

💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux&#xf…

入驻长沙!全球数据资产理事会长江中游中心挂牌成立

在全球数据资产化浪潮的推动下,长江中游地区迎来了其在数字经济领域的重要里程碑。 近日,《数据资产长江中游生态论坛暨数据资产入表和价值转化研讨会》于长沙圆满落幕,会上各产业专家、企业高管,围绕数据产品开发、数据资产融资…

小程序复制功能不可用 setClipboardData:fail no permission

先上图 用户协议剪切板也更新但是依旧报错了 最后在公众平台通知里发现是用户之前小程序有规格被封禁了该功能

IP地址SSL证书的申请流程-五大步骤教你如何申请

网站需要申请SSL证书,没有域名或者不方便提供域名,只有IP地址也可以申请SSL证书。特别需要注意的是,为IP地址申请ssl证书是需要开放443或者80端口,一般开放几分钟用来验证IP管理权即可! 申请IP地址的SSL证书&#xff…

13--memcache与redis

前言:数据库读取速度较慢一直是无法解决的问题,大型网站应对的方式主要是使用缓存服务器来缓解这种情况,减少数据库访问次数,以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…

阿里面试:canal+MQ,会有乱序的问题吗?

阿里面试:canalMQ,会有乱序的问题吗? 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的面试题…

一个 Docker 搭建的自动化电视剧下载和管理工具

大家好,我是CodeQi! 一个标准的“追剧狂人”。每周都有新剧上线,每天都要时刻关注各大影视平台的更新,这无疑是一项体力与脑力并存的艰巨任务。 于是,我决定为自己打造一个自动化的电视剧下载和管理工具。作为一个程序员,用 Docker 搭建这种自动化工具简直是小菜一碟。…

Vue组件通信props和$emit用法

父传子&#xff0c;通过props 子传父&#xff0c;通过$emit App.vue <template><div class"app" style"border: 3px solid #000; margin: 10px">我是APP组件<!-- 1.给组件标签&#xff0c;添加属性方式 赋值 --><!-- 添加属性传值 …

PointCloudLib GridMinimum获取栅格最低点 C++版本

测试效果 简介 在点云库(Point Cloud Library, PCL)中,如果你想要获取一个栅格(Grid)内的最低点,这通常意味着你需要先对点云数据进行某种形式的栅格化处理,然后在每个栅格内寻找最低的点。 测试代码 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointC…

2024透明加密软件最新推荐丨11款好用的透明加密软件

在数字化时代&#xff0c;文件与数据安全愈发重要&#xff0c;保护信息安全刻不容缓。文件加密软件应运而生&#xff0c;成为了信息安全的重要帮手。透明加密技术凭借众多的优点备受青睐。那么&#xff0c;什么是透明加密技术呢&#xff1f; 透明加密技术是一种在不影响用户正…

旷野之间11 - 开源 SORA 已问世!训练您自己的 SORA 模型!

​​​​​ 目前最接近 SORA 的开源模型是 Latte,它采用了与 SORA 相同的 Vision Transformer 架构。Vision Transformer 究竟有何独特之处?它与之前的方法有何不同? Latte 尚未开源其文本转视频训练代码。我们复制了论文中的文本转视频训练代码,并将其提供给任何人使用,…

帕金森小伙伴必看!这些维生素让你的生活更“稳“定!

&#x1f308; 嗨&#xff0c;亲爱的小伙伴们&#xff01;今天来跟大家聊聊帕金森病患者应该补充哪些维生素的小知识&#xff0c;让我们的身体更健康&#xff0c;生活更美好哦&#xff01;&#x1f609; &#x1f34e; 维生素C 你知道吗&#xff1f;维生素C不仅能让我们的皮肤…

【Linux】内核文件系统系统调用流程摸索

内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的&#xff1a; 我们打印的pid,tgid就是从这里来的&#xff0c;然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息&#xff1a; 从上述日志&#xff0c;其实我也把write的系统调用加了入口的打印信…

ADS基础教程24 - Gerber文件的导入

EM介绍 一、引言二、基本概念1.仿真文件下载2.仿真文件介绍 二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题 四、总结 一、引言 本章节开始介绍在ADS中进行PCB仿真&#xff0c;首先讲解如何将Gerber文件导入到A…

Spark RDD优化

Spark RDD优化 一、分区优化二、持久化优化三、依赖优化四、共享变量优化五、提交模式与运行模式优化六、其他优化 一、分区优化 分区数调整&#xff1a;RDD的分区数可以通过repartition和coalesce方法进行调整。合理的分区数可以提高并行度&#xff0c;但过多的分区会增加管…

2024年Wolf沃尔夫奖数学奖得主出炉:诺加·阿隆(Noga Alon)、阿迪·萨莫尔(Adi Shamir)

沃尔夫基金会官网&#xff1a;2024年沃尔夫数学奖联合颁发给了以色列魏茨曼科学研究所的阿迪萨莫尔 &#xff08;Adi Shamir&#xff0c;1952 -&#xff09; 教授和美国普林斯顿大学的诺加阿隆&#xff08;Noga Alon&#xff0c;1963 -&#xff09; 教授&#xff0c;表彰他们对…

ADI新型充电器解决方案可实现电池堆电压和充电效率

就目前而言&#xff0c;这可能是生活中zui常见的问题了。世纪之交&#xff0c;电池&#xff08;尤其是基于锂离子的电池&#xff09;成本的降低和性能的提高&#xff0c;推动了电池供电的储能和便携式设备的稳步增长。此外&#xff0c;超级电容器由于具有独特的性质&#xff0c…

引用类飘红,但是导入失败

背景&#xff1a; 引用类飘红&#xff0c;且显示可导入&#xff0c;但是导入一直失败。 列如下图&#xff0c;引导你可以导入依赖包&#xff0c;但是你发现按了导入他是导入不了的&#xff0c;就一直失败&#xff0c;就一直飘红 解决方案&#xff1a; 我们用一下idea的清理不…

IDEA中Debug的使用

自定义功能图表 功能说明 光标回到Debug行 执行到光标所在行 Force Step into Step into 进入JDK的配置 step into做了下述配置后&#xff0c;也可以和force step into一样进入到JDK中。 Trace Current Stream Chain Reset Frame 重置方法入栈 Force Return Break Point四…