AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

SQL Server 2016:行级安全

  • 2015-06-22
  • 本文字数:1232 字

    阅读完需:约 4 分钟

对于 SQL Server,一个常见的批评是,其安全模型只能识别表和列。用户如果希望以行为单位应用安全规则,就需要使用存储过程或表值函数来模拟,然后找一种方法,确保它们不会被绕开。在 SQL Server 2016 中,那不再是个问题。

实现

SQL Server 2016(及 SQL Azure)中的行级安全基于一个专门设计的内联表值函数。该函数要么返回一个只包含值1 的行,要么不返回结果,这取决于用户访问的行是否是相关行。请看下面的函数:

CREATE FUNCTION Security.fn_securitypredicate(@SalesRep AS sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @SalesRep = USER_NAME() OR USER_NAME() = 'Manager';这段代码的意思是,当前用户必须是一名经理,或者是一名与记录相关的推销员。该函数没有访问行本身,但用户可以使用参数传入相应的列(比如,SalesRep)。例如:

CREATE SECURITY POLICY SalesFilter ADD FILTER PREDICATE Security.fn_securitypredicate(SalesRep) ON dbo.Sales WITH (STATE = ON);实际效果

在使用行级安全时,用户无法看到他们不能访问的行。这就好像在访问表时自动增加一个额外的、安全相关的 where 子句。

由于其作用像一个 where 子句,所以有一些局限。例如,如果用户在那个列上使用了全文搜索索引,那么数据就可能泄露。此外,数据库还可能遭受旁路攻击。微软写道:

通过使用精心设计的查询,可以导致信息泄露。例如,SELECT 1/(SALARY-100000) FROM PAYROLL WHERE NAME=‘John Doe’ 会让一个恶意用户知道 John Doe 的工资是 10 万美元。即使有一个恰当的安全谓词阻止恶意用户直接查询其它人的工资,他也可以在查询返回“除数为 0”的异常时确定工资数额。

此外,信息也可能通过统计对象泄露。为了降低风险,查看受保护列统计信息的用户必须是“表的所有者,或者是服务器固有角色 sysadmin、数据库固有角色 db_owner 或 db_ddladmin 的成员”。

中间层应用程序

截至目前,我们讨论的场景是用户以自己的身份登录。在中间层应用程序中,所有人都共享同一个数据库账户,实现行级安全需要额外的步骤。

对于中间层应用程序,推荐的设计模式是将 CONTEXT_INFO 的值设置为连接打开时用户特定于应用程序的用户 id。然后,安全函数就可以引用 CONTEXT_INFO 的值。例如:

CREATE FUNCTION Security.fn_securitypredicate(@AppUserId int) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE DATABASE_PRINCIPAL_ID() = DATABASE_PRINCIPAL_ID('dbo') -- 应用程序上下文 AND CONVERT(int, CONVERT(VARBINARY(4), CONTEXT_INFO())) = @AppUserId; -- AppUserId (int) 占 4 个字节 GO CREATE SECURITY POLICY Security.SalesFilter ADD FILTER PREDICATE Security.fn_securitypredicate(AppUserId) ON dbo.Sales WITH (STATE = ON);该方法的前提是,用户无法执行任意 SQL,因为那会让他们可以随意更改 CONTEXT_INFO。

查看英文原文: SQL Server 2016: Row-Level Security

2015-06-22 07:081946
用户头像

发布了 1008 篇内容, 共 423.0 次阅读, 收获喜欢 346 次。

关注

评论

发布
暂无评论
发现更多内容

细节炸裂!阿里P8高管总结出这份1500页的Java编程思想(第六版)

Java~~~

Java 编程 架构 面试 网络

Alibaba内网“疯狂”传阅的P8开源出的SpringBoot入门到进阶小册

Java~~~

Java spring 架构 面试 Spring Boot

如何使用TCP/IP开发网络程序

华为云开发者联盟

Java TCP 网络协议 通信 客户端

全网震动!阿里员工人手一份却禁止外传的P5-P9Java进阶学习路线

Java~~~

Java 架构 面试 分布式 高并发

罗马道ROW质押挖矿系统开发技术搭建

薇電13242772558

Github星标百万!终于有人将Spring技术精髓收录成册

Java 编程 架构 面试 架构师

少侠留步!赠你一份阿里内部广为流传的23种设计模式核心笔记

Java~~~

Java 架构 面试 分布式 架构师

高薪offer有什么秘籍,不妨来此观看

hanaper

Python代码阅读(第20篇): 展开嵌套列表2

Felix

Python 编程 Code Programing 阅读代码

不可错过的mysql,redis,nginx视频讲解

hanaper

阿里的新“宠儿”!终于有人总结出了Spring源码从初级到高级手册

Java~~~

Java spring 架构 面试 Spring Cloud

在阿里离职后,从内部带走的这份485页面试合集,在GitHub上火了

Java~~~

Java 架构 面试 架构师

通过wireshark体验IP层分包

她的男人是程序员

面试过程中,遇到刁钻问题大家是怎么处理的?

hanaper

深入了解RocketMQ之Broker

邱学喆

broker 执行器 ConfigManager 处理器

Filecoin大涨:一文帮你了解filecoin挖矿!

区块链 分布式存储 IPFS filecoin挖矿 filecoin矿机

靶向蛋白质组技术研发进入快车道,北鲲云超算为技术顺利推进提供有力支撑

北鲲云

在PyQt中构建 Python 菜单栏、菜单和工具栏

华为云开发者联盟

Python

GitHub上这份阿里的Java高并发核心手册,即使再过20年依然“NB”

Java~~~

Java 架构 面试 分布式 高并发

铁山靠!阿里P9架构师写的这份JDK源码笔记,竟直接带火了GitHub

Java~~~

Java 架构 jdk 面试 架构师

ipfs是什么项目是国家许可的吗?ipfs国家认可吗?

IPFS国家认可吗 ipfs是什么项目 ipfs是国家许可的吗

Java全家桶的这些知识,不用学了

Java 架构 后端 计算机

模块六作业:拆分电商系统为微服务

Felix

基于语音情感识别的应用和挑战,详解华为云的语音情感识别方案

华为云开发者联盟

学习 语音 情感识别 跨模态知识迁移 跨模态

fil矿机挖矿收益怎么计算?fil矿机挖矿效率怎么提升?

fil矿机挖矿收益怎么计算 fil矿机挖矿效率怎么提升

醍醐灌顶Nginx 原理和架构

hanaper

设计创新:通过设计创新改造世界

石云升

设计思维 设计师 8月日更 设计创新

Linux如何进行GPIO读写操作的?

华为云开发者联盟

Linux value GPIO GPIO开发 sysfs

逮虾户!清华架构师吐血整理出这份多线程并发指南,带你弯道超车

Java~~~

Java 架构 面试 分布式 多线程

「iOS独立开发」基于iCloud构建用户体系

LabLawliet

ios 8月日更 独立开发

Go 泛型初体验

Rayjun

Go 语言

SQL Server 2016:行级安全_安全_Jonathan Allen_InfoQ精选文章