【问题标题】:SQL Server security - stored proceduresSQL Server 安全性 - 存储过程
【发布时间】:2014-12-02 00:20:46
【问题描述】:

我正在尝试在我们的应用程序(主要包括使用 SQL Server 存储过程的网站)上实施安全性。

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

  • SQL Server 数据库 - [data1]
  • SQL Server 数据库 - [webSPs]
  • PHP / Symfony 网络应用程序

所有数据都驻留在[data1] 的表中,同一台服务器上还有另一个“数据库”,它只包含网络应用程序使用的存储过程。

SQL Server 有一个登录“webapp”,作为[webSPs] 上的用户,它只具有运行[webSPs] 中存储过程的权限。

但是,当这些存储过程在 [data1] 表上读取、写入和附加数据时,此用户必须是 [data1]db_datawriterdb_datareader 数据库角色的成员。

这一切都很好,但似乎这里的安全性存在漏洞,因为访问[webSPs] 的用户不仅可以运行存储过程,还可以写入任何基础表 - 是否可以提供类似这样的权限:

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

根据我的阅读,我认为如果没有第二个我猜想破坏所有权链接的数据库,它会像我希望的那样工作。

提前谢谢你。

【问题讨论】:

  • 将存储过程放在另一个数据库中的动机是什么?这似乎使事情变得不必要地比他们需要的复杂......
  • 用户不必是 db_datawrite 的成员就可以从存储过程中写入数据。如果他们有权执行该过程,他们将能够写入数据。所以是的,要回答您的问题,您不允许此用户直接写入表,但要授予他们对过程的执行权限。
  • Sean,表在不同的数据库中,如果用户没有明确的读/写数据权限,则返回错误:“SELECT permission denied on...”我认为这是因为 SP 在另一个数据库中(根据上面 Marc 的 cmets)只是想知道是否有办法解决这个问题,因为我想尽可能保持分离。
  • 值得注意的是,another, very similar, question 仅比您早半小时被问到。我相信对该问题的公认答案应该适用于存储过程以及触发器。

标签: sql-server


【解决方案1】:

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

  1. 在您的 WebSps 数据库中创建证书。
  2. 将证书备份并恢复到 data1 数据库
  3. 从证书创建用户
  4. 向 data1 中基于证书的用户授予任何读写权限
  5. 通过调用add signature 语法为您想要使用跨数据库证书的任何存储过程签名

请记住,每次更改过程(通过更改或删除并创建)时,签名都会丢失。因此,您将处于不断的重新签名周期中。你可以阅读更多关于模块签名的过程here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多