SQL Server 2016动态数据掩码字段UPDATE覆盖问题如何配置规避?
这个问题完全可以通过配置或者代码逻辑调整来解决,我给你几个实用的方案,按安全优先度排序:
1. 优化应用的UPDATE逻辑(最安全,推荐首选)
动态数据掩码本来就是用来限制敏感数据可见性的,所以前端拿到xxxx是正常的。问题出在你的应用把这个掩码值当成真实值去更新了。解决思路很简单:
- 只更新用户实际修改过的字段:在前端做个标记,记录哪些字段被用户编辑过,后端生成UPDATE语句时,只把这些修改过的字段加入
SET子句。这样没被编辑的掩码字段就不会出现在UPDATE里,自然不会覆盖原有值。 - 如果必须全字段更新:可以在UPDATE语句里加个判断逻辑,比如:
这样如果前端传的是掩码值UPDATE YourTable SET OtherColumn = @OtherValue, MaskedColumn = CASE WHEN @MaskedInput = 'xxxx' THEN MaskedColumn ELSE @MaskedInput END WHERE Id = @RecordId;xxxx,就保留数据库里的原有值,不会被覆盖。
2. 调整数据库权限(适合需要应用看到真实值的场景)
如果业务允许应用程序查看掩码字段的真实值,可以给应用的数据库账号授予UNMASK权限:
- 全局授权:
GRANT UNMASK TO [YourApplicationUser]; - 更精细的列级授权(推荐,遵循最小权限原则):
这样应用读取数据时就能拿到真实值,前端显示的是真实内容,更新时自然不会传GRANT UNMASK ON OBJECT::[YourSchema].[YourTableName]([MaskedColumnName]) TO [YourApplicationUser];xxxx了。不过要注意,这会绕过动态数据掩码的限制,必须确保应用的访问是安全合规的。
3. 利用存储过程封装更新逻辑(数据库层兜底方案)
如果不想改动应用代码,也可以在数据库层封装更新逻辑:
创建一个专用的存储过程,接收需要更新的字段参数,在存储过程内部判断掩码字段的输入值——如果是xxxx就跳过该字段的更新,否则才执行修改操作。这样把判断逻辑放在数据库端,也能避免原有值被错误覆盖。
内容的提问来源于stack exchange,提问作者David Ruiz
相关产品推荐
相关产品推荐

