类型:数据库类大小:40.0M语言:中文评分:5.9标签:立即下载存储过程和触发器是Sql Server经常用于数据库开发和管理的两个对象。但是,如果存储过程和触发器的权限设置不当,会给数据库带来巨大的安全隐患,或者是MS这样设计的,或者是我自己危言耸听。测试环境:sql server2005。首先,建立一个测试环境
建立测试数据库创建数据库测试
在测试数据库中建立两个表
创建表t1(id int,名称varchar(10))
创建表t2(id int,名称varchar(10))
将一行数据插入t2表
插入t2
选择1,“trieagle”
为sql身份验证建立登录帐户trieagle,同时在测试数据库中建立trieagle
一.存储过程
场景描述:如果用户有创建和执行存储过程的权限,用户可以创建一个存储过程,在这个存储过程中可以操作其他表中的数据。即使用户对其他表没有操作权限,也可以调用存储过程来操作其他表中的数据。
1.授予trieagle用户创建存储过程的权限和执行存储过程的权限
授予trieagle创建进程
注意:如果trieagle用户想要创建存储过程,他们可能还需要修改模式的权限
将模式: dbo上的alter授予trieagle
2.trieagle建立了一个存储过程
创建进程p1
如同
从t2中选择*
3.授予trieagle用户执行p1存储过程的权限
将p1上的exec授予trieagle
4.trieagle执行p1存储过程
高管P1
结果
Id名称
1三烯丙基
已成功查看t2表中的数据。
隐患在于,如果用户可以执行和修改存储过程,那么数据库中的数据就处于不安全的状态。
解决方案:如果应该允许用户创建一个存储过程,那么就让用户在自己的模式上创建,这样可以避免上述问题。那就是:
管理员:将创建模式授予trieagle
用户:创建架构三元组
去
创建proc trieagle.p1
如同
从t2中选择*
去
特里亚格尔长官。第一亲代
结果:
消息229,第14级,状态5,程序p1,第3行
对对象“t2”(数据库“test”,架构“dbo”)的SELECT权限被拒绝。
甲骨文也存在同样的情况。oracle解释说,执行存储过程时,执行器将使用存储过程设计器拥有的权限,但authid current_user可用于指定用户在运行存储过程时使用的权限。Sql server中也有类似的语句是作为执行的,但是还没有学习使用方法,例如:
创建进程p1
执行方式为“trieagle”
如同
从t2中选择*
第二,扳机
场景描述:如果用户拥有修改表的权限以及对表的其中一个权限(插入、更新、删除),则用户可以创建触发器。然后用户可以在触发器中查看其他表的数据,甚至可以插入、修改、删除其他表的数据,即使用户对其他表没有任何操作权限。
首先,建立一个测试环境
授予trieagle用户将数据插入t1和修改t1的权限
将t1上的alter授予trieagle
将t1上的插入授权给trieagle
请注意,此处没有授予trieagle用户对t2表的任何权限。
第二,trieagle用户创建触发器
创建触发器t_query_t2
在t1上
用于插入
如同
从t2中选择*
三.trieagle将数据插入t1表
插入t1 select 2 ' Wang '
通过观察结果,您会发现t2表中的数据将成功显示。结果:
Id名称
特里亚格尔
潜在的安全隐患是,如果用户可以创建触发器,并且对表具有插入、更新和删除权限之一,则数据库中的数据实际上处于不安全状态。与房东的观点相反。我认为存储过程只是DBA控制数据权限最有力的工具。使用存储过程控制权限,表达能力可以远远超过选择更新删除等授权。例如,工资单是在用户UserA下建立的。对于用户UserB来说,可以给员工加薪,但是他的官方一次只能给用户一百元。用户UserC是一个伟大的领导者,他可以给每个人的工资加0。在这种情况下,在数据库级别,很明显使用授权语句不会导致问题,因此存储过程就派上了用场。首先,用户UserB和UserC被授权对UserA拥有选择权限。Salar,但禁止更新和删除。在UserA下建立存储过程ProAdd100,在salar表中给薪资加100;授予用户b执行Proadd100的权利;在UserA下建立存储过程ProMulti10,将salar表工资乘以10;授予用户执行Promulti10的权限。这样就可以随意控制数据的权限。多么强大。数据库管理员杀手.在mssql中,存储过程中引用的其他存储过程可能不存在,这也是一个小隐患。如果程序直接访问数据库,它也可能访问不存在的表。这也是一个隐患。条条大路通罗马。关键不是走哪条路,而是质量。异常处理是必要的。