gpt4 book ai didi

c# - SQL 添加数据的权限以及如何验证?

转载 作者:太空宇宙 更新时间:2023-11-03 18:01:18 26 4
gpt4 key购买 nike

我正在寻找一种好方法来维护有关谁可以将数据添加到 C# 应用程序和 SQL Server 2005 中的数据库的权限。

虽然我需要解释清楚。那么让我们举个例子:

我有两个用户 BobJim ,两者都已添加到 SQL 权限,因此它们具有对数据库的写入权限。现在所有访问都基于域用户帐户。所有其他用户只有读取权限。

现在我有几个表,例如:

  • 用户
  • 用户权限
  • 书籍
  • 图书出版商

所以 UserPermissions包含用户和图书出版商的列表。例如:Bob有权为 MS Press 添加书籍和 Jim有权为 O'Reilly 添加书籍.

现在我需要验证这些信息并限制他们可以添加的内容。

所以说 Jim从命令行使用我的应用程序,他写了类似的东西:

Addbook.exe "C# 3.0 in a Nutshell" "O'Reilly"

该工具应该继续将书添加到书表。

现在说 Bob尝试相同的命令,该工具应该出错,因为他没有通过 O'Reilly 添加书籍的权限.

现在我需要知道如何做几件事。

  • 验证用户首先具有对 SQL Server 的写入权限
  • 验证用户是否具有添加 books 的写权限由特定出版商
  • 此外,我还需要在工具实际尝试添加数据之前验证以上内容是否属实,即在工具继续之前我需要先验证反馈

现在我不是 100% 担心用户注入(inject)恶意数据,虽然最好阻止它,但它是一个内部工具,我想我可以信任用户......(可能)

无论哪种方式,我都不知道从哪里开始,我的 SQL 技能非常缺乏。

Akk,最后一件事,我不想使用存储过程添加数据。

最佳答案

好吧,让我们分解一下:

验证用户是否可以写入表(如果为真则返回 1,否则返回 0):

SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', 'OBJECT', 'INSERT'), 0)

验证用户是否可以编写该发布者:

SELECT count(*) FROM UserPermissions WHERE
UserName = 'username' AND Publisher = 'publisher'

现在,这就是那些的 SQL,而不是实际的 C#。在 C# 中获取值:

SqlConnection SqlConn = new SqlConnection("connection_string_goes_here");
SqlCommand SqlCmd = new SqlCommand();

SqlConn.Open();
SqlCmd.Connection = SqlConn;
SqlCmd.CommandText = "SELECT isnull(has_perms_by_name('MyDb.dbo.MyTable', " +
"'OBJECT', 'INSERT'), 0)"

if (SqlCmd.ExecuteScalar())
{
SqlCmd.CommandText =
"SELECT count(*) FROM UserPermissions WHERE " +
"Username = " + System.Environment.UserDomainName + "\" +
System.Environment.UserName + " " +
AND Publisher = @Publisher";
SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar);
SqlCmd.Parameters("@Publisher").Value = PublisherInput;

if(SqlCmd.ExecuteScalar())
{
SqlCmd.Parameters.Clear();
SqlCmd.CommandText = "INSERT INTO Books (Title, Publisher) VALUES " +
"(@Title, @Publisher)";
SqlCmd.Parameters.Add("@Title", SqlDbType.NVarChar);
SqlCmd.Parameters.Add("@Publisher", SqlDbType.NVarChar);
SqlCmd.Parameters("@Title").Value = TitleInput;
SqlCmd.Parameters("@Publisher").Value = PublisherInput;
SqlCmd.ExecuteNonQuery();
}
}

SqlCmd.Dispose();
SqlConn.Close();
SqlConn.Dispose();

最后一点,清理您的输入。在您的应用程序中使用参数,不要信任任何用户,即使是内部用户也是如此。我怎么强调都不为过。

编辑:因为剥猫皮的方法不止一种,我觉得不包括 LINQ to SQL 解决方案(至少在计数问题上)是愚蠢的:

int PermsAvailable = (from up in db.UserPermissions
where up.Username ==
System.Environment.UserDomainName + "\" +
System.Environment.UserName
&& up.Publisher == PublisherInput
select up).Count();
if(PermsAvailable)
{
var NewBook = New Book with {.Title = TitleInput, .Publisher = PublisherInput};
db.Books.Add(NewBook);
}

关于c# - SQL 添加数据的权限以及如何验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/962482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com