网站制作的公司哪家比较好,网页作图软件,wordpress子页面怎么修改密码,网站广告条幅怎么做动态的文章目录 要解决什么背景Jsqlparser安全系统难点目标 方法语法树遍历实现初始化第一轮第二轮第三轮 总结 要解决什么
企业进行软件开发、数据分析、数据查询时#xff0c;不可避免的涉及到数据安全的问题#xff0c;不同人员能看到的数据不同#xff0c;如何识别哪些敏感数… 文章目录 要解决什么背景Jsqlparser安全系统难点目标 方法语法树遍历实现初始化第一轮第二轮第三轮 总结 要解决什么
企业进行软件开发、数据分析、数据查询时不可避免的涉及到数据安全的问题不同人员能看到的数据不同如何识别哪些敏感数据被查询了或者被通过一些处理后隐性的被查询了是非常重要的。如手机号直接判断是否查询手机号是十分容易的但是如果查询时通过两次SQL查询一次查询前手机号前3位一次查询后8位则不易被发现数据也已泄露。本文介绍如何解决“在SQL使用中发现使用敏感数据泄露的行为”。
背景
Jsqlparser
Jsqlparser是一个用Java编写的SQL解析器可以将SQL语句解析成语法树方便开发人员进行SQL语句的分析和操作。目前有很多类似的SQL解析器此类解析器只能将语句解析为语法树但是不能使上下层结构的业务逻辑关联在一起因而它只是一个工具如何判断最终结果中是否涉及敏感数据的逻辑还需要我们自己编写。
安全系统
目前有一些商用的数据安全系统包含数据脱敏功能开源的如archery。此类系统可以识别一定类型的SQL语句但是只包含简单结构像包含多层嵌套查询、关联查询、函数处理、casewhen语法时系统不能检测出。
难点
难点无法支持复杂的嵌套查询、无法支持函数处理后的数据、无法支持casewhen语法、无法支持union关键字等。
目标
搭建一种易于扩展的SQL分析架构能够方便的分析SQL语法树建立上下层嵌套语句间的关系使得SQL查询过程中能够便捷的支持各种语法识别出可能的敏感数据泄露行为。
方法
语法树遍历
使用Jsqlparser工具将SQL解析为语法树选择深度遍历优先算法。有两个重要概念 一是敏感数据的传染。 即在深度优先遍历时先找到最底层的子句根据from后的数据源找出本子句使用的敏感数据如果上层父语句使用此数据则对映数据被传染为敏感数据。 二是敏感数据表。 即维护一个敏感数据数据名称来源表来源字段的三元组集合。一开始集合中只包含数据库中的原始字段我们把敏感数据做一个事前的基础维护。然后在分析语法树的每层结构时不断增加这个集合的内容一旦某层的中间数据被传染则加入到集合中并记录来源。最后自下而上一层层追溯到顶端则可以发现全部被传染的敏感数据。
实现
// 数据三元组如下
public class Col {public String srcTable;// 真实来源表public String srcCol;// 真实来源列public String name;// 别名
}
// 数据集合如下
private HashMapString, SetCol tableMaps new HashMap();以select a.pho,b.money, (select f.name from user_friend f where f.user_id a.id limit 1) friendName from (select pho from (select phone pho from user t1 where t1.create_time ‘2023-05-01’) t where t.create_time ‘2023-01-01’) a join bank b on a.id b.user_id;为例
初始化
首先初始化中间数据集合这些初始信息由其他系统认为设置或自动扫描识别得到如我们设置user表的phone是敏感信息则初始集合为Colname:phone,srcCol:phone,srcTable:user。
使用Jsqlparse等工具解析sql为语法树对语法树进行深度优先遍历,伪代码如下
public void visit(PlainSelect plainSelect) {//accept(this)递归本方法实现深度遍历PlainSelect sub findSub(plainSelect.getFromItem());sub.accept(this);ListJoin joins plainSelect.getJoins();for (Join join : joins) {PlainSelect s findSub(join.getRightItem());s.accept(this);}for (SelectItem selectItem : plainSelect.getSelectItems()) {PlainSelect sub findSub(selectItem);sub.accept(this);}
}第一轮
第一轮处理如下子句根据集合得知phone为敏感数据pho虽然重新定义了别名但其被传染为敏感数据则集合中增加一条Colname:t.pho,srcCol:phone,srcTable:user (select phone pho from user t1 where t1.create_time ‘2023-05-01’) t
第二轮
第二轮处理如下子句根据上一轮集合结果t.pho为敏感数据,则a.pho也被传染为敏感数据则集合中增加一条Colname:a.pho,srcCol:phone,srcTable:user (select pho from (select phone pho from user t1 where t1.create_time ‘2023-05-01’) t where t.create_time ‘2023-01-01’) a
第三轮
第三轮处理如下子句根据上一轮集合结果a.pho为敏感数据,则最终发现a.pho是敏感数据依此类推。 select a.pho,b.money, (select f.name from user_friend f where f.user_id a.id limit 1) friendName from (select pho from (select phone pho from user t1 where t1.create_time ‘2023-05-01’) t where t.create_time ‘2023-01-01’) a join bank b on a.id b.user_id;
总结
1、便于逻辑分析每次只需要解决上下相邻层间的逻辑问题而不必跨层大大降低了难度。 2、逻辑结构清晰多层嵌套问题被切割成了两层语句的问题便于后期更复杂逻辑的扩展。