在SQL Server中使用别名用户的安全问题

2016-02-19 13:51 0 1 收藏

人生本是一个不断学习的过程,在这个过程中,图老师就是你们的好帮手,下面分享的在SQL Server中使用别名用户的安全问题懂设计的网友们快点来了解吧!

【 tulaoshi.com - 编程语言 】

  SQL Server有很多很好用的小功能,但是有时候这些功能反过来给你制造麻烦。其中一个这样的问题是别名用户的使用。本技巧教你如何在数据库中建立别名用户时找到安全漏洞,不过在SQL Server 2008种不推荐这个功能。

  首先,你可以对每个数据库运行下面的简单查询或者针对所有数据库操作它来运行以便找到带有“dbo”访问权限的用户。

  SELECT DISTINCT DB_NAME() DATABASE_NAME,

  SU.NAME DATABASE_USERNAME

  FROM SYSUSERS SU

  JOIN SYSMEMBERS SM

  ON SM.MEMBERUID = SU.UID

  INNER JOIN SYSMEMBERS SM1

  ON SM.MEMBERUID = SM1.MEMBERUID

  INNER JOIN SYSUSERS SU1

  ON SM1.GROUPUID = SU1.UID

  AND SU1.NAME = 'db_owner'

  AND SU.NAME 'dbo'

  但是,此查询可能不能找到所有具有“dbo”访问权限的用户,因为SQL Server 中的一个安全漏洞。让我来解释这个问题。

  让我们创建两个登录,AliasUser1和DBUser1.

  别名AliasUser1分配给“dbo”角色。

  把用户DBUser1添加到角色“dbo”中,如果我们需要把“dbo”权限授给一个数据库用户,那么这是一种很正常的行为。

  下面的脚本将为我们做这些动作:

  IF NOT EXISTS (SELECT *

  FROM SYS.SERVER_PRINCIPALS

  WHERE NAME = N'AliasUser1‘)

  CREATE LOGIN [AliasUser1]

  WITH PASSWORD=N'test', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english],

  CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

  GO

  IF NOT EXISTS (SELECT *

  FROM SYS.SERVER_PRINCIPALS

  WHERE NAME = N'DBUser1’)

  CREATE LOGIN [DBUser1]

  WITH PASSWORD=N'test', DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english],

  CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF

  GO

  --add a aliased user with dbo priveleges

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  exec sp_addalias 'AliasUser1','dbo'

  --add a regular db user to the dbo role

  CREATE USER [DBUser1] FOR LOGIN [DBUser1]

  现在,让我们从SSMS中检验我们刚创建的用户。注意,我们别名到“dbo”中的“AliasUser1”没有在用户下面出现。SQL Server没有在“用户”列表中显示别名用户。

图一 SSMS中的数据库用户

  那么我们要如何找到一个数据库中的别名用户呢?执行下面的查询:

  select * from sys.sysusers

  在下面的结果集中,我们看到“AliasUser1”前面有一个“”,如果我们检查字段“isaliased”,在右边的第三个字段,那么它有一个为1的值。

图二 图三 sys.sysusers

  下面的命令也能运行来显示所有的用户和别名。在下面的输出结果中,你可以看到别名用户“AliasUser1”没有作为一个用户出现,但是在第二个结果集中它作为一个别名用户出现。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  exec sp_helpuser

图四 sp_helpuser

  另一个需要注意的有趣之处是,你不能使用sp_dropuser存储过程来删除一个别名用户,相反,要使用sp_dropalias来删除。

  通过一个登录使用一个到“dbo”的别名,这将让你完全访问自己的数据库,例如一个db_owner.不足之处是在SSMS中没有一个地方可以看到这个过程。你可以自己尝试。在其中一个你自己数据库中按照下面的步骤,然后使用登录“AliasUser1”和密码“test”,你可以看到该登录可以在你创建别名的数据库中进行任何它想要的行为。

  下一步骤

  针对你的数据库运行sp_helpuser,看看你是否建立了别名。

  如果有别名用户具有“dbo”级别的权限,那么看看删除这些并使用下面所述的角色。

  这个别名功能被微软阻止了很长一段时间,但是它仍然在2005中使用。我认为这是基于向后兼容的考虑。该功能在SQL 2008中取消了。

  因此,如果你的应用程序正在使用别名,而它在SQL 2008中不能使用,那么使用上面提到的不同方法试试。

来源:https://www.tulaoshi.com/n/20160219/1605420.html

延伸阅读
标签: Web开发
我现在的做法,但我不想这样写:  [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]我希望能做到创建calendar时,不需要把calendar1传入,在setTimeout参数里,直接可以通过this.thread_result()执行  [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行] 幻宇前辈不在 我先来现一把拙:) [Ctrl+A 全选 注:如需引...
标签: Java JAVA基础
  一、概述   当网络编程越来越方便,系统功能越来越强大,安全性却指数倍地下降。这恐怕就是网络编程的不幸和悲哀了。各种动态内容生成环境繁荣了WWW,它们的设计目标就是为了给开发者更多的力量,给最终用户更多的方便。正因为如此,系统设计师和开发者必须明确地把安全问题作为一个考虑因素,事后追悔很难奏效。  ...
儿童玩具是为特定年龄组的儿童设计和制造的,它拥有一个关键性的因素,那就是能吸引儿童的注意力。不同年龄段的宝宝,玩具也是各式各样,玩具越来越多,玩具安全也成为人们不可忽视的问题。 常见的玩具安全问题 玩具安全很重要,很多玩具上松动的零件,毛绒玩具上未粘牢的眼睛、鼻子,玩具上掉落的纽扣,汽车上的轮子等,这些小零...
Delphi支持参数化SQL语句,不过俺很少用Paramters/Params属性,一般都是自己构造SQL, 用SQL.Text:='Select * from ..Where ID='''+edit1.text+''''; 不过这种方法要小心SQL注入攻击哦。 今天改用ADOQuery控件的Paramters属性,本已为简单的很,一用发现了不少问题。由于我只使用一个ADOQuery控件...
标签: Web开发
今天一个查询需要通过 ExcuteReader  返回结果集,同时又想输出参数,刚开始的时候一直得不到输出参数的值,以为存储过程出错,但是在查询分析器里面测试是正确的,而且输出参数确实已经赋值。 更加让人百思不得其解的是,对出输出强制类型转换丢出异常之后,确又可以得到了,难道是ado.net 的bug,想象页不可能啊,这么常用的API...

经验教程

640

收藏

34
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部