【问题标题】:Open SQL Server database with read-only access - making sure以只读访问权限打开 SQL Server 数据库 - 确保
【发布时间】:2016-11-30 15:25:48
【问题描述】:

我有一个用 C# 编写的具有 SQL Server 后端的应用程序。我们将让高级用户能够通过针对系统数据库编写和执行他们自己的 SQL 脚本来创建报告。

现在,很明显,我不能使用系统用于连接的 SQL Server 用户,因为用户很容易能够修改数据库中的数据。我知道我不能强制从 C# 应用程序以只读方式打开连接,因此我必须使用对数据库具有只读权限的用户。

我正计划测试与报告目的连接的用户是否具有对数据库的只读访问权限。如果访问是只读的,则将执行查询,否则将拒绝执行。如何从 C# 应用程序或使用 T-SQL 进行测试?

【问题讨论】:

  • 这实际上取决于您如何实现应用程序的安全性。例如,您可以自己滚动并使用只读帐户(或组)。您可以使用 SQL 的安全性并捕获异常。如果您使用的是那里管理的 SSRS,如果您正在使用它的接口。如果可能的话,我喜欢使用内置的安全性并寻找各种异常。
  • 我想指出这是一个非常非常糟糕的主意。您实际上是在为“高级用户”提供使您的数据库服务器因编写不佳的查询而瘫痪的能力。
  • Kevin:会的,但是少数被允许执行这些查询的人知识渊博,足以知道他们在做什么。此外,即使查询(这将相当简单)选择整个数据库中的所有数据,我们在系统中的任何时候都没有可能损害性能的大量数据。我想要的只是确保超级用户选择的连接具有只读访问权限。

标签: c# sql-server database tsql access-rights


【解决方案1】:

您可以检查用户是否有任何用户映射,而不是 db_datareader 用于相关数据库。我找到了good TSQL query,但由于排序规则冲突,它无法在我的系统上运行。这是该帖子的更新版本,适用于我。您可以在 SQL Server Management Studio 中运行它以了解返回的数据。

DECLARE @name SYSNAME = N'ReadonlyUserNameHere'; -- input param, presumably

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'UNION ALL SELECT N''' + REPLACE(name,'''','''''') + ''',
  p.name COLLATE DATABASE_DEFAULT, p.default_schema_name COLLATE DATABASE_DEFAULT, STUFF((SELECT N'','' + r.name 
  FROM ' + QUOTENAME(name) + N'.sys.database_principals AS r
  INNER JOIN ' + QUOTENAME(name) + N'.sys.database_role_members AS rm
   ON r.principal_id = rm.role_principal_id
  WHERE rm.member_principal_id = p.principal_id
  FOR XML PATH, TYPE).value(N''.[1]'',''nvarchar(max)''),1,1,N'''')
 FROM sys.server_principals AS sp
 LEFT OUTER JOIN ' + QUOTENAME(name) + '.sys.database_principals AS p
 ON sp.sid = p.sid
 WHERE sp.name = @name '
FROM sys.databases WHERE [state] = 0;

SET @sql = STUFF(@sql, 1, 9, N'');

PRINT @sql;
EXEC master.sys.sp_executesql @sql, N'@name SYSNAME', @name;

在为 C# 重写查询时,一定要使用参数化查询来注入用户名。

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2011-02-20
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多