防止具有有限 SELECT 访问权限的角色发现 Azure SQL 或 SQL Server 中的对象名称

问题描述 投票:0回答:1

我们在 Azure SQL 数据库上创建了一个角色,我们希望将其设置为仅对表的子集进行有限访问。

这样做非常简单,除了一个小问题外,效果也很完美。当用户使用此角色登录时,理想情况下我们不希望他们能够“发现”他们无权访问的内容。

一个简单的例子:

SELECT * FROM [dbo].[Foo]

这会产生错误“Msg 208 Invalid object name 'dbo.foo'”

但是,当用户运行时

SELECT * FROM [dbo].[ATableTheyDoNotHaveAccessTo]

他们收到错误“Msg 229 对象的 SELECT 权限被拒绝”(等等......)

这样做的问题是,如果一个人对数据库模式足够保密,那么用户获得“Msg 229”是不可接受的。他们可能无法看到数据,但获取该消息将向他们证明他们找到了潜在的数据源,这可能会促使他们更加努力地获取这些数据,这是我们希望避免的事情.

我知道这有点偏执,但如果我们能做些什么让它在两种情况下输出相同的东西,那将会有所帮助。我查看了 sp_altermessage,但我不认为这会更改消息 ID (208 v 229),因此足够了解 SQL Server 或 Azure SQL 的人仍然会从该消息 ID 中获得提示。

sql-server azure-sql-database
1个回答
0
投票

不,您无法更改这些错误,它们是产品的基础。对象权限错误和无效对象错误是截然不同的错误。它们的处理方式也完全不同。权限错误是非中止的,这意味着批处理将在遇到错误后继续,但是,无效对象错误将中止,并且批处理中后面的任何语句都不会被执行(忽略

TRY...CATCH
es)。

您也无法更改系统错误消息的值,尤其是在 Azure SQL 数据库等环境中。即使可以,这样做也不是一个好主意,我会强烈建议反对它,如果它在某种程度上是可能的。

事实上,没有解决办法。我也不认为这是一个问题。如果

USER
确实猜出了无法访问的对象的名称,那么“恭喜”他们;他们仍然无法对该物体做任何事情。如果他们设法破坏另一个
LOGIN
,那么他们就可以通过查询系统对象轻松查看他们可以使用该
LOGIN
访问哪些对象。

我认为它对他们有利的唯一方法是,如果您的进程以提升的权限运行动态语句(因为动态 SQL 会丢失链接),并且这些语句容易被注入。那么根本问题不是使用

LOGIN
访问对象的人,而是您的代码存在漏洞。

© www.soinside.com 2019 - 2024. All rights reserved.