提高“数据库层”的安全性 - 只允许选择查询

时间:2010-03-10 00:02:27

标签: sql-server security linq-to-sql

我正在Silverlight中构建一个应用程序,使用户可以阅读有关其付款的信息。他们的登录名和密码将保存在db。中的表中。

通过限制查询可以访问的数据,可以提高应用程序的安全性吗?例如,我想阻止用户选择他们不拥有的数据。一个限制是我的应用程序正在为用户使用自己的表,所以我不能使用GRANT PERMISSION:/。我正在使用Linq来构建我的SQL查询。

这个问题来自我的老师“建议”我提高安全性,所以如果这是不可能的 - 这没什么大不了的;)

3 个答案:

答案 0 :(得分:3)

嗯,这是你提出的一个模糊的问题,但是我会冒这个问题。

您必须对用户的身份进行一些身份验证才能向他们显示付款,而不是其他人的付款。所以,如果你能做到这一点,你应该能够创建不允许表格上的任何插入,更新或删除的触发器来自那些相同的身份...我不认为这是一个非常强大或可扩展的解决方案,但这是个主意。

CREATE TRIGGER [x] ON [TABLE] FOR INSERT

/* Disallow Users to insert */
IF EXISTS( SELECT 1 1 FROM [Users] WHERE [Users].UserID = [Y])
--Rollback transaction, set error, etc

你还有更多细节吗?其他任何东西都有助于找到更好的解决方案。

答案 1 :(得分:1)

对数据库资源进行微调的访问控制是保护应用程序的一种非常罕见的方法。用户级访问控制最好由应用程序植入。应用程序使用的sql用户帐户应尽可能受限制。例如,它应该只能使用它需要运行的数据库,仅此而已。

对于sql数据库,只有1个项目具有细粒度访问控制,该项目为SE-PostgreSQL

  

“它可以提供细粒度的强制性   对各种数据库的访问控制   表,列或等对象   元组并且可以应用一致   远程/本地客户端的权限   与操作系统集成   独立于数据库   授权“。

答案 2 :(得分:0)

在“付款”表格上创建名为“MyPayments”的视图。确保视图定义中有WHERE子句,以便视图仅向每个用户返回相关数据。以下是视图的WHERE子句:

WHERE PaymentOwner = SUSER_SNAME()

SUSER_SNAME()系统函数返回当前登录用户的登录名。如果第一个用户使用登录名“User1”登录并插入一行,则他/她的登录名将与该行一起存储。视图定义的WHERE子句中的SUSER_SNAME()函数确保“User1”仅查看将“PaymentOwner”列设置为“User1”的行。

更多here