Archery icon indicating copy to clipboard operation
Archery copied to clipboard

MSSQL查询脱敏的问题[ bug ]

Open jimsoft1000 opened this issue 4 years ago • 2 comments

在提交 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、手工部署

jimsoft1000 avatar Oct 26 '21 03:10 jimsoft1000

暂时没办法很好的解析SQL server的语法,采取的是全量匹配的模式

hhyo avatar Oct 26 '21 13:10 hhyo

我也考虑过这个问题,最好的办法是,在SQL执行之前,将脱敏字段从SQL里去掉,不在结果集里展示脱敏字段,这个方式针对非MySQL数据库类型的数据库,还是可以接受的,如果从结果中进行字段脱敏,如果采用字段别名,就不太好处理 例如: select user,bankname as t from test 如果bankname是脱敏字段,执行之后,结果集中的列名是t,就没办法匹配了

jimsoft1000 avatar Oct 27 '21 00:10 jimsoft1000