【问题标题】:Security issues on user defined functions for Sql server 2012Sql server 2012 用户定义函数的安全问题
【发布时间】:2015-02-17 07:52:25
【问题描述】:

我正在 C# 中创建用户定义的函数,如链接中所述:https://msdn.microsoft.com/en-us/library/w2kae45k%28v=vs.90%29.aspx

(我使用C# CLR项目,我有VS 2010,SQL server 2012。VS 2010中的代码在framework 3.5中,sql server在framework 4.0中)

我没有成功部署,即使我选择了正确的服务器+数据库,所以我像这样手动复制了dll:

  1. 新建sql项目作为链接(我选择Visual C# CLR数据库对象,选择服务器+数据库)
  2. 添加用户自定义函数:

    使用系统; 使用 System.Data; 使用 System.Data.SqlClient; 使用 System.Data.SqlTypes; 使用 Microsoft.SqlServer.Server;

    公共部分类 UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction()] 公共静态 int testfunc() { // 把你的代码放在这里 返回 1234; } };

  3. 把dll放到sql server的程序集中(在sql ssms:databases->“数据库名”->可编程性->程序集->新建程序集->...选择权限集“安全的dll” ")。

  4. 像这样添加一个新函数: 创建函数 testfunc() 返回整数 作为 外部名称 SqlServerProject1.UserDefinedFunctions.testfunc

(SqlServerProject1是命名空间和dll名,UserDefinedFunctions是类名,testfunc是C#和sql server中的函数名)

  1. 在执行 select dbo.funcname() 时一切正常,但现在在将 C# (testfunc) 中的代码更改为此代码时出现问题(请参阅下面的异常):

    [Microsoft.SqlServer.Server.SqlFunction()] 公共静态 int testfunc() { WebClient webC = new WebClient(); WebRequest 请求 = HttpWebRequest.Create("http://axdev:8090"); 返回 12345; }

    1. 运行select dbo.testfunc()时出现异常,我得到:

消息 6522,第 16 级,状态 2,第 1 行 执行用户定义的例程或聚合“testfunc”期间发生 .NET Framework 错误: System.Security.SecurityException:请求“System.Security.Permissions.SecurityPermission,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089”类型的权限失败。 System.Security.SecurityException: 在 System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 create) 在 System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission 上限、StackCrawlMark 和 stackMark) 在 System.Security.CodeAccessPermission.Assert() 在 UserDefinedFunctions.testfunc()

  1. 我无法使用权​​限集 =“无限制”创建程序集(与第 3 步相同,但使用“无限制”,因为我收到错误消息:

> 标题:Microsoft SQL Server Management Studio

SqlAssembly 'SqlServerProject1' 的创建失败。 (Microsoft.SqlServer.Smo)

如需帮助,请点击:http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=11.0.3000.0+((SQL11_PCU_Main).121019-1325+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=Create+SqlAssembly&LinkId=20476


其他信息:

执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)


为程序集“SqlServerProject1”创建程序集失败,因为程序集“SqlServerProject1”未获得 PERMISSION_SET = UNSAFE 的授权。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该证书或非对称密钥具有相应的登录名并具有 UNSAFE ASSEMBLY 权限。 (Microsoft SQL Server,错误:10327)

如需帮助,请点击:http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.3128&EvtSrc=MSSQLServer&EvtID=10327&LinkId=20476


按钮:

好的

  1. 如何解决上述问题才能正常运行新的testfunc代码?

========

一个新问题 - 在运行 alter database 'mydb' set trustworthy on 后,再次添加“permission set” = unrestricted 的程序集时出现新错误。

标题:Microsoft SQL Server Management Studio

SqlAssembly 'SqlServerProject1' 的创建失败。 (Microsoft.SqlServer.Smo)

如需帮助,请点击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=11.0.3000.0+((SQL11_PCU_Main).121019-1325+)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates.FailedOperationExceptionText&EvtID=Create+SqlAssembly&LinkId=20476

------------------ 附加信息:

执行 Transact-SQL 语句时发生异常或 批。 (Microsoft.SqlServer.ConnectionInfo)


master 数据库中记录的数据库所有者 SID 与 数据库“mydb”中记录的数据库所有者 SID。你应该纠正 这种情况通过使用重置数据库“mydb”的所有者 ALTER AUTHORIZATION 语句。 (Microsoft SQL Server,错误:33009)

如需帮助,请点击: http://go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.3128&EvtSrc=MSSQLServer&EvtID=33009&LinkId=20476

谢谢:)

【问题讨论】:

  • 错误消息告诉您解决问题的两种方法。您是否尝试过其中任何一个?
  • 对于第二个异常(第 7 步),我运行“alter database mydbname set trustworthy on”,得到一个新错误(我把它放在我的帖子中)。

标签: c# .net sql-server visual-studio-2010


【解决方案1】:

将权限更改为无限制访问是一种不好的做法。最好创建一个具有不受限制权限的新登录访问权限并将其用于 clr 调用。您必须在 clr 程序集中使用一些线程或套接字编程。它确实需要不受限制的访问。

【讨论】:

  • 我不明白。我需要使用 web html(它是本地 Intranet - 用于 rest-api 以获得一些结果)。逻辑不能在sql server上,所以架构是:sql server call by using rest-api a method that is on the other server (我传递了用户id,以及一些用于安全认证检查的信息),在另一端我需要产生一些信息。因为我在原始帖子中声明了许多安全异常 - 我需要管理它们。这就是架构,我需要一种方法来克服这些安全问题。提前致谢。
  • 我需要调用该函数'testfunc'并且在步骤6.0中没有得到异常。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-30
  • 2014-12-26
  • 2018-08-06
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2015-03-05
相关资源
最近更新 更多