作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
受到我见过的各种与模式相关的问题的启发......
Ownership chaining如果存储过程和表都在同一架构中,则允许我对存储过程进行 GRANT EXECUTE 对我使用的表没有显式权限。
如果我们使用单独的模式,那么我必须在不同的模式表上显式地 GRANT XXX。所有权链接示例演示了这一点。这意味着存储过程执行用户可以直接读/写您的表。
这就像直接访问类中的实例变量,绕过 getter/setter,破坏封装。
我们还使用行级安全来限制某人看到的内容,并将其应用到存储过程中。
那么,我们如何才能保持模式分离并防止直接访问表呢?
当然,如果您使用 ORM 或不使用存储过程,则该问题将不适用。但我不是问我是否应该使用 ORM 或存储过程以防万一有人觉得需要启发我......
编辑,示例
CREATE USER OwnsMultiSchema WITHOUT LOGIN
GO
CREATE SCHEMA MultiSchema1 AUTHORIZATION OwnsMultiSchema
GO
CREATE SCHEMA MultiSchema2 AUTHORIZATION OwnsMultiSchema
GO
CREATE USER OwnsOtherSchema WITHOUT LOGIN
GO
CREATE SCHEMA OtherSchema AUTHORIZATION OwnsOtherSchema
GO
CREATE TABLE MultiSchema1.T1 (foo int)
GO
CREATE TABLE MultiSchema2.T2 (foo int)
GO
CREATE TABLE OtherSchema.TA (foo int)
GO
CREATE PROC MultiSchema1.P1
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
EXEC AS USER = 'OwnsMultiSchema'
GO
--gives error on OtherSchema
EXEC MultiSchema1.P1
GO
REVERT
GO
CREATE PROC OtherSchema.PA
AS
SELECT * FROM MultiSchema1.T1
SELECT * FROM MultiSchema2.T2
SELECT * FROM OtherSchema.TA
Go
GRANT EXEC ON OtherSchema.PA TO OwnsMultiSchema
GO
EXEC AS USER = 'OwnsMultiSchema'
GO
--works
EXEC OtherSchema.PA
GO
REVERT
GO
最佳答案
我担心你的描述或你对所有权链接的概念不清楚,所以让我从这个开始:
“所有权链接”只是指当在 SQL Server 上执行存储过程(或 View )时,当前执行的批处理在执行该 SQL 代码时临时获取 sProc 的所有者(或 sProc 的架构的所有者)的权利/许可。所以在 sProc 的情况下,用户不能使用这些 privs 做任何 sProc 代码没有为他们实现的事情。尤其要注意,它从不获取 身份所有者的,只有它的权利,暂时(但是,EXECUTE AS... 确实这样做)。
因此,利用这一点来确保安全性的典型方法是:
CREATE proc [TestCnxOnly].[spShowProc_Security_NoEX] as
--no "With Execute as Owner" for this version
--create User [UserNoLogin] without login
--Grant connect on database :: TestSecurity to Guest
--alter database TestSecurity set trustworthy on
--Show current user context:
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (sproc)]
, suser_sname() as sname
, system_user as system_
--Execute As Login = 'UserNoLogin'
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (after exec as)]
, suser_sname() as sname
, system_user as system_
EXEC('select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in Exec(sql))]
, suser_sname() as sname
, system_user as system_')
EXEC sp_ExecuteSQL N'select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (in sp_Executesql)]
, suser_sname() as sname
, system_user as system_'
--Revert
select current_user as current_
, session_user as session
, user_name() as _name
, suser_name() as [suser (aftr revert)]
, suser_sname() as sname
, system_user as system_
关于sql-server-2005 - SQL Server : How to permission schemas?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2212044/
我是一名优秀的程序员,十分优秀!