Sql server SQL Server安全-存储过程
我正在尝试在我们的应用程序(主要由使用SQL Server存储过程的网站组成)上实现安全性 Microsoft似乎建议最佳做法是将所有数据功能包装到存储过程中,我们已经完成了这一点。我们的结构类似于: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数据库-
[data1]
- SQL Server数据库-
[webSPs]
- PHP/Symfony web应用程序
[data1]
中的表中,同一服务器上还有另一个“数据库”,其中只包含web应用程序使用的存储过程
SQL Server有一个登录名“webapp”,作为[webps]
上的用户,该登录名仅具有运行[webps]
中存储过程的权限
但是,当这些存储过程在[data1]
表上读取、写入和追加数据时,该用户必须是[data1]
中的db\u datawriter
和db\u datareader
数据库角色的成员
这一切都很好,但这里的安全性似乎有一个漏洞,因为访问[webps]
的用户不仅可以运行存储过程,还可以写入任何底层表-是否可以授予如下权限:
您可以读取/写入此数据库上的表,但只能通过SPs,不能直接读取/写入
从我所读到的内容来看,如果没有第二个数据库,我想它会像我所希望的那样工作,我想这是打破所有权链接的第二个数据库
提前谢谢你。是的,但坦率地说,实施起来很痛苦。您可以使用模块签名。基本上,你:
addsignature
语法,对要使用证书的跨数据库存储过程进行签名请记住,每次更改过程(通过alter或drop和create)时,签名都会丢失。因此,您将处于一个不断的重新签名周期中。您可以阅读有关模块签名过程的更多信息将存储过程放入另一个数据库的动机是什么?这似乎使事情变得不必要地比需要的复杂……用户不必是db_datawrite的成员就可以从存储过程写入数据。如果他们有执行该过程的权限,他们将能够写入数据。因此,是的,要回答您的问题,您不允许此用户直接写入表,而是授予他们对过程的执行权限。Sean,如果表位于不同的数据库中,如果用户没有显式的读/写数据权限,它将返回一个错误:“SELECT permission DENITED on…”我认为这是因为SPs在另一个数据库中(根据上面Marc的评论),只是想知道是否有办法解决这个问题,因为如果可能的话,我希望保持分离。值得注意的是,在你的数据库出现前半个小时才被问到。我相信这个问题的公认答案应该适用于存储过程以及触发器。