签名存储过程中的一个权限问题

chenjunsheep 2008-08-19 10:23:51
做了一个签名存储过程的T-SQL,碰到一个权限问题,操作流程如下:

(环境:SQL2005/数据库:DEMO/登陆USER:SA/权限:ADMIN)

1.在拥有ADMIN权限的用户SA下,建立存储过程
--该过程创建了一个LOGIN和USER
create procedure sp_CreatePrincipal
@name varchar(256),
@password varchar(128)
as
declare @sqlcmd varchar(2000)
begin tran

-- create LOGIN
set @sqlcmd = 'create login ' + quotename(@name) + ' with password = ' + quotename(@password, '''')
exec (@sqlcmd)
if @@error <> 0
begin
rollback tran
print 'Cannot create login'
return
end

-- create USER
set @sqlcmd = 'create user ' + quotename(@name)
exec (@sqlcmd)
if @@error <> 0
begin
rollback tran
print 'Cannot create user'
return
end

commit tran
go


2.执行该存储过程
--创建用户alice,密码1234
exec sp_CreatePrincipal 'alice', '1234'


3.切换用户到alice,并执行该存储过程
※到这里为止,alice还没有被赋予任何权限
--在用户alice下,创建新用户bob
execute as login = 'alice'
sp_CreatePrincipal 'bob', '1234'
revert


4.对存储过程的签名操作...(略)

【疑问:】
问题就出在第3步.
alice在没有被赋予任何权限的情况下,居然可以执行该存储过程(不单单是执行存储过程,UPDATE,DELETE,INSERT操作都可以对该数据库的任何表进行操作).
于是我很难过,
没有被赋予任何权限的用户为何能毫不费力的执行这些操作呢...
...全文
81 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
guoli0813 2008-08-19
  • 打赏
  • 举报
回复
楼主刚才我看了下sp_开头的存储过程有这样的弊端,希望你也看一下:
尽量不要以sp_为前缀命名存储过程
ms sql server里,在命名存储过程的时候,尽量避免要用sp_这样的前缀开头,文中的一个实验方法我试了下,也的确是这个回事,原因是如果假设你在数据库a里建立了存储过程,而以sp_x为前缀进行命名存储过程的话,会在寻找的时候,先到master数据库里去找的,这当然是找不到的哦。另外,查看微软的帮助说明可以看到如下的介绍:
烈建议您不要创建以 sp_ 为前缀的存储过程。SQL Server 始终按照下列顺序查找以 sp_ 开头的存储过程:
在 master 数据库中查找存储过程。
根据所提供的任何限定符(数据库名称或所有者)查找该存储过程。
如果未指定所有者,则使用 dbo 作为所有者查找该存储过程。
因此,虽然当前数据库中可能存在带 sp_ 前缀的用户创建的存储过程,但总会先检查 master 数据库(即使该存储过程已用数据库名称限定)。
chenjunsheep 2008-08-19
  • 打赏
  • 举报
回复
自己顶,别沉 ..
liyan93834183 2008-08-19
  • 打赏
  • 举报
回复
学习
忆轩辕 2008-08-19
  • 打赏
  • 举报
回复
其实只要看一下alice的权限就知道了,应该是dbo
忆轩辕 2008-08-19
  • 打赏
  • 举报
回复
问题在于你的create user上,仔细看一下联机帮助吧

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧