如何确保我的C#应用​​程序只能从SQL Server数据库中读取?

时间:2011-11-16 19:12:20

标签: c# sql-server

我正在构建一个C#应用程序,它运行/导出批量的Crystal Reports到PDF文件。我所做的一些测试表明,将数据推送到报表比让ReportDocument刷新自己的数据更有效。

我找到了一种从Crystal Reports中提取SQL的方法,现在我只需要安全地执行sql并将结果绑定回Crystal Report。我的问题是Crystal Reports绝对没有内置检查来确保用户不会创建有害的Crystal Reports。您可以创建Crystal Report,添加SQL命令表,并提供以下“查询”:

DELETE FROM tbl_Test; SELECT * FROM tbl_Test

Crystal Reports不会看到上述SQL的任何问题。刷新报告时,您将丢失tbl_Test中的所有数据。唯一的限制是创建/运行报告的sql用户的权限。

所以,我需要确保我的程序不会拉/执行任何有害的东西。我能想到的最好的方法是在SQL Server上创建一个新用户帐户,该帐户具有对所有数据库的只读访问权限,并使用此帐户在我的应用程序中建立连接。

这样做的问题是,我将让我的用户使用他们现有的SQL Server用户帐户登录,每个用户帐户都有自己关于他们可以访问的数据库的现有权限。我仍然需要根据个人权限限制每个用户可以查看的内容,但是其中一些用户对许多数据库具有写权限,我还需要确保从我的应用程序到任何数据库的任何连接都是100%只读的。

是否有任何方法可以使用具有插入/更新/删除/等权限的用户帐户的SQL身份验证来建立与SQL Server的只读连接?

P.S。我知道任何具有足够权限/技术诀窍/动机的用户都可以使用Crystal Reports(......或任何数量的第三方应用程序)来直接损害我们的数据库。现在我更关心的是确保我的申请不能成为不知情的帮凶。 = P

1 个答案:

答案 0 :(得分:5)

这并不是强迫您对应用程序中的所有内容使用相同的连接。为什么不为此特定任务使用特定连接。这样,您可以保留所有现有用户权限相同,但是对于此特定任务,创建与sql用户的新连接,该用户只具有对所需表的只读访问权限。这样,报告中没有任何狡猾的SQL会做任何坏事。