宝哥软件园

MS Sql Server 2005存储过程和触发器的安全风险分析

编辑:宝哥软件园 来源:互联网 时间:2021-08-03

类型:数据库类大小: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中,存储过程中引用的其他存储过程可能不存在,这也是一个小隐患。如果程序直接访问数据库,它也可能访问不存在的表。这也是一个隐患。条条大路通罗马。关键不是走哪条路,而是质量。异常处理是必要的。

更多资讯
游戏推荐
更多+