Archery
Archery copied to clipboard
MSSQL查询脱敏的问题[ bug ]
在提交 issue 前,请查阅以下资源,请先进行搜索来保证没有类似的 issue。 文档 | FAQ
重现步骤
给MSSQL配置表字段脱敏之后,通过查询功能,会把所有查询列设置成脱敏
原因: 是由于下面这段代码,取出规则时,只包含正则表达式,没有去匹配库,表,字段等信息 def brute_mask(instance, sql_result): """输入的是一个resultset sql_result.full_sql sql_result.rows 查询结果列表 List , list内的item为tuple
返回同样结构的sql_result , error 中写入脱敏时产生的错误.
"""
# 读取所有关联实例的脱敏规则,去重后应用到结果集,不会按照具体配置的字段匹配
rule_types = DataMaskingColumns.objects.filter(instance=instance).values_list('rule_type', flat=True).distinct()
masking_rules = DataMaskingRules.objects.filter(rule_type__in=rule_types)
for reg in masking_rules:
logger.error(f"打印日志 reg: {reg.rule_regex}")
logger.error(f"打印日志 reg: {reg.__dict__}")
compiled_r = re.compile(reg.rule_regex, re.I)
replace_pattern = r""
rows = list(sql_result.rows)
for i in range(1, compiled_r.groups + 1):
if i == int(reg.hide_group):
replace_pattern += r"****"
else:
replace_pattern += r"\{}".format(i)
for i in range(len(sql_result.rows)):
temp_value_list = []
for j in range(len(sql_result.rows[i])):
# 进行正则替换
temp_value_list += [compiled_r.sub(replace_pattern, str(sql_result.rows[i][j]))]
rows[i] = tuple(temp_value_list)
sql_result.rows = rows
return sql_result
期待结果和实际结果
期待结果:
实际结果:
截图
错误日志
版本信息
应用版本/分支:
部署方式:Docker、手工部署
暂时没办法很好的解析SQL server的语法,采取的是全量匹配的模式
我也考虑过这个问题,最好的办法是,在SQL执行之前,将脱敏字段从SQL里去掉,不在结果集里展示脱敏字段,这个方式针对非MySQL数据库类型的数据库,还是可以接受的,如果从结果中进行字段脱敏,如果采用字段别名,就不太好处理 例如: select user,bankname as t from test 如果bankname是脱敏字段,执行之后,结果集中的列名是t,就没办法匹配了