Sql server SQL Server安全-存储过程

Sql server SQL Server安全-存储过程,sql-server,Sql Server,我正在尝试在我们的应用程序(主要由使用SQL Server存储过程的网站组成)上实现安全性 Microsoft似乎建议最佳做法是将所有数据功能包装到存储过程中,我们已经完成了这一点。我们的结构类似于: SQL Server数据库-[data1] SQL Server数据库-[webSPs] PHP/Symfony web应用程序 所有数据都驻留在[data1]中的表中,同一服务器上还有另一个“数据库”,其中只包含web应用程序使用的存储过程 SQL Server有一个登录名“webapp”,

我正在尝试在我们的应用程序(主要由使用SQL Server存储过程的网站组成)上实现安全性

Microsoft似乎建议最佳做法是将所有数据功能包装到存储过程中,我们已经完成了这一点。我们的结构类似于:

  • SQL Server数据库-
    [data1]
  • SQL Server数据库-
    [webSPs]
  • PHP/Symfony web应用程序
所有数据都驻留在
[data1]
中的表中,同一服务器上还有另一个“数据库”,其中只包含web应用程序使用的存储过程

SQL Server有一个登录名“webapp”,作为
[webps]
上的用户,该登录名仅具有运行
[webps]
中存储过程的权限

但是,当这些存储过程在
[data1]
表上读取、写入和追加数据时,该用户必须是
[data1]
中的
db\u datawriter
db\u datareader
数据库角色的成员

这一切都很好,但这里的安全性似乎有一个漏洞,因为访问
[webps]
的用户不仅可以运行存储过程,还可以写入任何底层表-是否可以授予如下权限:

您可以读取/写入此数据库上的表,但只能通过SPs,不能直接读取/写入

从我所读到的内容来看,如果没有第二个数据库,我想它会像我所希望的那样工作,我想这是打破所有权链接的第二个数据库


提前谢谢你。

是的,但坦率地说,实施起来很痛苦。您可以使用模块签名。基本上,你:

  • 在WebSps数据库中创建证书
  • 将证书备份并还原到data1数据库
  • 从证书创建用户
  • 向data1中基于证书的用户授予任何读写权限
  • 通过调用
    addsignature
    语法,对要使用证书的跨数据库存储过程进行签名

  • 请记住,每次更改过程(通过alter或drop和create)时,签名都会丢失。因此,您将处于一个不断的重新签名周期中。您可以阅读有关模块签名过程的更多信息

    将存储过程放入另一个数据库的动机是什么?这似乎使事情变得不必要地比需要的复杂……用户不必是db_datawrite的成员就可以从存储过程写入数据。如果他们有执行该过程的权限,他们将能够写入数据。因此,是的,要回答您的问题,您不允许此用户直接写入表,而是授予他们对过程的执行权限。Sean,如果表位于不同的数据库中,如果用户没有显式的读/写数据权限,它将返回一个错误:“SELECT permission DENITED on…”我认为这是因为SPs在另一个数据库中(根据上面Marc的评论),只是想知道是否有办法解决这个问题,因为如果可能的话,我希望保持分离。值得注意的是,在你的数据库出现前半个小时才被问到。我相信这个问题的公认答案应该适用于存储过程以及触发器。