无法限制用户使用内置 SQL Server 函数

Posted

技术标签:

【中文标题】无法限制用户使用内置 SQL Server 函数【英文标题】:Unable to restrict user from built in SQL Server Functions 【发布时间】:2022-01-06 14:46:02 【问题描述】:

我们有一个 SQL Server(标准)数据库,我们试图将权限限制为仅对某些表(CREATE、SELECT、UPDATE、DELETE)的 CRUD 操作,并且只允许连接权限。但是,用户仍然可以访问所有系统功能。虽然其中一些是必需的,但我们希望限制用户使用其中一些功能。例如; host_id()、Db_Id() 等

到目前为止,我们有以下配置:

在服务器级别

服务器登录 - ServerLogin1

特定的 SQL Server 登录 角色:ServerRole1 和公共 用户映射:以 DbUser1 身份到 Database1,并具有 DbRole1 和 public 的成员身份 Securables:: TSQL 默认 TCP - GRANT 连接

服务器角色 - ServerRole1

Securables:TSQL 默认 TCP - GRANT 连接 Securables:服务器 - GRANT 连接 SQL

在数据库级别

数据库角色 - DbRole1

Securables:sysb 架构 - 拒绝 - 创建序列、删除、执行、插入、引用、选择、更新、查看更改跟踪、查看定义 Securables:所有系统视图 - DEBY - 选择 Securables:我们所有的数据库表 - GRANT - 删除、插入、选择、更新

数据库用户 - DbUser1

仅分配了 DbRole1 Securables:在 sys 架构上 - 拒绝 - 删除、插入、选择、更新

但是,我们似乎无法找到一种方法来限制用户使用某些系统功能。我们如何拒绝这些权限?

【问题讨论】:

host_id()Db_Id() 的安全问题可能是什么?而且您不需要DENY,只需创建一个只有您需要的GRANT 的角色并将用户放入其中 我们正在使用此 SQL 用户通过应用程序连接到数据库,目前我们无法通过应用程序限制某些 SQL Server 内置功能。我们正在努力解决这个问题,但需要一个临时解决方案。我们已经创建了一个特定的角色,但是在创建用户时,用户会自动获取公共角色,并且公共角色允许内置函数,如 host_id() 和 Db_Id(() 我仍然不明白你为什么要这样做(如果用户访问他们自己的host_iddb_id 怎么办?他们已经知道了。)但是你试过@987654327 @和DENY VIEW DATABASE STATE TO DBRole1 【参考方案1】:

无法限制内置函数的使用。在 SQL Server 2019(命名为“feature restrictions”)中实现处理此类限制的系统尝试失败,但幸运的是,它从未脱离 beta / CTP(幸运的是因为它无法实现阻止某些类型的目标可以通过不同的内置函数和/或语言结构完成的活动)。

甚至不可能限制会话查看自己的数据。这意味着,您不仅不能限制DB_ID(),甚至不能阻止登录名可以从sys.databases 访问的行。 DB_ID 的文档甚至指出:

权限

...调用者连接的数据库将始终出现在sys.databases中。

【讨论】:

以上是关于无法限制用户使用内置 SQL Server 函数的主要内容,如果未能解决你的问题,请参考以下文章

是否有列出 SQL Server 中所有内置函数的系统表或系统视图?

SQL Server 转换 xml 并解析单个值,但不使用内置函数

SQL Server用户定义的函数(UDF)使用详解

SQL-server'WEEKDAY'不是公认的内置函数名称[关闭]

Sql Server内置函数实现MD5加密

Oracle 内置sql函数大全