c# - SQL CLR 触发器,由于透明代码调用关键代码,如何使程序集可信?

标签 c# sql-server security sqlclr

我已深入研究 SQL CLR。不幸的是,我的第一个示例在对安全代码的透明代码调用方面存在问题。

重点是我的 SQL CLR 触发器被视为透明代码。在触发器中,我使用 Quartz 调用 Quartz Windows 服务:

var properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "ServerScheduler";

properties["quartz.scheduler.proxy"] = "true";
properties["quartz.scheduler.proxy.address"] = string.Format("tcp://{0}:{1}/{2}", "localhost", "555",
                "QuartzScheduler");

var schedulerFactory = new StdSchedulerFactory(properties);

IScheduler scheduler = schedulerFactory.GetScheduler();

错误:

(135,1): SQL72014: .Net SqlClient Data Provider: Msg 6522, Level 16, State 1, Procedure AfterMarketSessionInserted, Line 1 A .NET Framework error occurred during execution of user-defined routine or aggregate "AfterMarketSessionInserted": System.MethodAccessException: Attempt by security transparent method '.Database.Triggers.MarketSessionTriggers.AfterMarketSessionInserted()' to access security critical method 'Quartz.Impl.StdSchedulerFactory..ctor(System.Collections.Specialized.NameValueCollection)' failed.

Assembly 'Database, Version=1.0.5275.15169, Culture=neutral, PublicKeyToken=null' is partially trusted, which causes the CLR to make it entirely security transparent regardless of any transparency annotations in the assembly itself. In order to access security critical code, this assembly must be fully trusted. System.MethodAccessException: at Database.Triggers.FinancialMarketSessionTriggers.AfterFinancialMarketSessionInserted()

--------------

为什么 SQL CLR 触发器代码被认为是透明代码并受到部分信任?

如何使 SQL CLR 触发器代码不是透明代码或使其完全受信任?

我乐于接受建议。

最佳答案

Why is SQLCLR code only trusted partially?

默认情况下,在 SQL Server 内部运行的 CLR 代码(即“SQLCLR”)受到高度限制,以免降低 SQL Server 的安全性或稳定性。

How do you make SQLCLR fully trusted?

程序集中的 CLR 代码可以做什么(主要)由每个程序集的 PERMISSION_SET 属性控制。如果在通过 CREATE ASSEMBLY 加载程序集时未指定 PERMISSION_SET,则默认设置为 SAFE,这是最受限制的,完全信任。为了使 CLR 代码能够到达 SQL Server 外部(到达网络、文件系统、操作系统等),您需要至少将程序集设置为 EXTERNAL_ACCESS,但这是仍然不完全信任。为了被视为完全信任,您需要将程序集设置为UNSAFE

为了将任何程序集设置为 EXTERNAL_ACCESSUNSAFE,您需要执行以下操作之一:

  • 使用密码对程序集进行签名,从程序集中创建非对称 key ,从非对称 key 创建登录名,授予登录名UNSAFE ASSEMBLY 权限。这是首选方法。
  • 将包含程序集的数据库设置为 TRUSTWORTHY = ON。这假定数据库的所有者具有 UNSAFE ASSEMBLY 服务器级权限(通常是这种情况)。虽然此选项更快/更容易,但由于 TRUSTWORTHY = ONfairly wide-open security hole 而不是首选。 .

如果您想更详细地了解 SQLCLR 安全性,尤其是关于 SAFE 程序集的限制程度,请查看此 article我在 SQL Server Central 上写的。

关于c# - SQL CLR 触发器,由于透明代码调用关键代码,如何使程序集可信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24153370/

相关文章:

c# - WPF DataGridRow IsSelected 触发器

c# - 在任何应用程序中持久层有什么用?

c# - 将 EF6 数据库优先从 SQL Server 迁移到 PostgreSQL

php - 测试 Web 应用程序中的安全漏洞 : Best practices?

php - 在通过电子邮件发送用户输入的数据之前,我是否需要对其进行清理

c# - 在 C# 中动态设置类的枚举属性

c# - 如何清除Viewstate?

sql-server - SQL Server 可空列

sql - 如何从此表中检索 DISTINCT 值?

wcf - 如何允许我的 Azure 网站访问我的 Azure 云服务