【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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:081516
用户头像

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

关注

评论

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

提示工程在AI绘画领域中的应用

FinFish

AI绘画 提示工程

运维训练营第17周作业

好吃不贵

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

前端工程师leetcode算法面试必备-二分搜索算法(上)

js2030code

JavaScript LeetCode

MQTT 5.0新特性:属性与载荷

EMQ映云科技

物联网 IoT mqtt 企业号 3 月 PK 榜 载荷

天工人巧日争新:昇腾AI的绚丽今日

脑极体

AI

Nautilus Chain 现已推出测试网“Triton ”,有哪些潜在的机会?

EOSdreamer111

深入react源码看setState究竟做了什么?

flyzz177

React

PyTorch深度学习实战 | 搭建卷积神经网络进行图像分类与图像风格迁移

TiAmo

PyTorch 图像处理

React Context源码是怎么实现的呢

flyzz177

React

细说react源码中的合成事件

flyzz177

React

React-Hooks源码深度解读

goClient1992

React

看透react源码之感受react的进化

goClient1992

React

最新Blender 3.3安装包+详细安装教程

Finovy Cloud

blender 3D软件

使用Nginx作为MySQL的TCP负载均衡器

Janwee

nginx 负载均衡 :MySQL 数据库

Java线程池执行器的饱和策略

Janwee

线程池 java

什么大模型?我是时尚产业“大模王”!

脑极体

AI

微信小程序管理软件助力企业数字化转型,实现智能化升级

FinFish

私有小程序技术 小程序管理平台 小程序技术 小程序管理

如何用好免费的chatGPT

劼哥stone

人工智能 openai ChatGPT

Amazon Detective 支持 Amazon EKS 上的 Kubernetes 工作负载以进行安全调查

亚马逊云科技 (Amazon Web Services)

Java中让两个线程交替执行的实现方式

Janwee

并发 信号量 java 多线程、

Nautilus Chain 现已推出测试网“Triton ”,有哪些潜在的机会?

股市老人

前端工程师leetcode算法面试必备-二分搜索算法(下)

js2030code

JavaScript LeetCode

一天吃透分布式事务八股文

程序员大彬

Java 分布式事务

React源码分析(一)Fiber

goClient1992

React

深入探究 Go log 标准库

江湖十年

Go 后端 日志 log

盘点10款优秀的工作任务进度管理软件

PingCode

项目管理 项目进度管理 项目进度管理软件

毕业设计

张贺

mybatis plus怎么使用注解的方式执行原生sql

俊俊哥

mybatis Mybatis-Plus 原生sql

马克·安德森:纯粹产品护城河在硅谷少见,SaaS公司护城河是“分销”

B Impact

精华推荐 |【深度挖掘RocketMQ底层源码】「生产故障分析系列」深度挖掘RocketMQ底层那些导致消息丢失的汇总盘点透析(TIMEOUT_CLEAN_QUEUE)broker busy

洛神灬殇

RocketMQ 消息队列 3月日更 原理分析 底层源码

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