0

我在用户 PC 上安装了一个富客户端程序,我想开始在 SQL Azure/SQL Server 上存储一些用户创建的数据。潜在的匿名用户将输入他们的姓名、电子邮件帐户和密码,这些密码将存储在 SQL Azure/SQL Server 上。然后他们将开始生成自己的数据。我预计可能有 1000 个用户。

有时这些用户希望对自己的数据运行自己的查询,但显然,我必须确保他们永远无法查看其他用户的数据。

我认为确保数据安全的最佳方法是为每个用户颁发自己的 SQL Azure 帐户和密码。我将设置一个只有我知道的 SQL Azure 用户和长密码,它只有权执行几个存储过程,并将适当的参数传递给那些将创建 SQL Server 帐户、登录并将用户添加到角色的 SP我创造了。

显然,运行调试工具的人可以找出用户名和密码,但我认为这没什么大不了的。如果该特定 SQL Azure 帐户所能做的就是执行一些 SP,那么如果恶意个人开始这样做怎么办。在我要求付款之前,我只允许上传非常有限的数据。

用户只能使用使用以下内容的存储过程插入记录:

SELECT @uName=SYSTEM_USER 

并且只选择适当的父记录。用户可以执行的所有存储过程都将具有上述要求,以确保他们只能使用自己的记录。

所有视图都将嵌入其中的 WHERE 子句,例如

WHERE tbLoginName = SYSTEM_USER.

我是 SQL Server 的新手,所以我可能会遗漏一些基本概念,因此我将不胜感激。

4

3 回答 3

0

我想指出您提到的方法中的一个潜在问题:您的主 SQL Azure 帐户需要有权创建新帐户并授予他们对特定表的访问权限。这意味着您的主账户本身也需要访问所有这些表。如果您将主帐户存储在客户端,聪明的用户将可以访问所有用户数据。

根据我的经验,直接从客户端应用程序连接到数据库几乎总是会降低您的解决方案的安全性。您可以出于测试目的这样做,但在现实世界的解决方案中,我建议您使用服务。您可以在 Windows Azure 中托管该服务。然后服务将访问数据库,客户端应用程序只能访问服务。通过这种方式,您可以使用您喜欢的任何机制(例如 ASP.NET 成员资格)对客户端进行身份验证。

此致,

明旭。

于 2012-05-18T06:37:59.680 回答
0

您实际上是在创建一个物理的两层数据库连接,允许客户端应用程序直接连接到数据库。这在许多方面都是一个问题,包括安全性和性能。从安全的角度来看,不控制客户连接的位置,您需要保持防火墙规则对世界上任何人都开放,以尝试破解每个客户的 uid/pwd。而不是只有 1 个用户 id 可以玩,黑客将拥有多达 1,000 个......

第二个问题是性能。您的应用程序将无法利用连接池,从而对数据库服务器造成过度压力,并可能在某些时候遇到限制问题。使用 Web 服务、具有 ASP.NET 成员资格来管理登录,并使用服务帐户(即相同的 uid/pwd)来获取数据,如果您保持所有请求的连接字符串相同,您将确保正确利用连接池.

借助 Web 服务层,您还可以轻松获得两层架构无法提供的大量新选项。这包括集中您的业务和数据访问逻辑、添加缓存以提高性能、在集中位置添加审计、允许对应用程序的某些部分进行更新而无需在客户位置重新部署任何内容等等……

在云中,您最好利用 Web 服务。

我的 2 美分。

于 2012-05-18T12:42:44.797 回答
0

正如http://msdn.microsoft.com/en-us/library/ms189751.aspx指出的那样,问题是:

在 SQL Azure 中,只有服务器级主体登录(由供应过程创建)或 master 数据库中 loginmanager 数据库角色的成员才能创建新登录。

这些帐户还能够更改和删除登录名。因此,如果您将这些帐户嵌入到客户端应用程序中,您实际上是在授予每个用户更改/删除其他用户帐户的权限。虽然普通用户不会这样做,但黑客会这样做。因此,您不能让客户端应用程序管理 SQL Azure 登录,除非只允许受信任的用户(例如您的 IT 管理员)使用该应用程序。

此致,

明旭。

于 2012-05-21T08:00:38.847 回答