在 SQL Server 主机中加载和执行托管代码的能力需要满足主机对代码访问安全和主机资源保护的要求。 代码访问安全要求由三个 SQL Server 权限集之一指定:SAFE、EXTERNAL-ACCESS 或 UNSAFE。 在 SAFE 或 EXTERNAL-ACCESS 权限集内执行的代码必须避免使用那些已应用 HostProtectionAttribute 属性的类型或成员。 安全 HostProtectionAttribute 权限不如可靠性保证,因为它标识主机可能禁止的特定代码构造(类型或方法)。 使用 HostProtectionAttribute 强制实施有助于保护主机稳定性的编程模型。
注释
代码访问安全性(CAS)已在 .NET Framework 和 .NET 的所有版本中弃用。 使用与 CAS 相关的 API 时,最新版本的 .NET 不遵循 CAS 注释并生成错误。 开发人员应寻求完成安全任务的替代方法。
宿主保护属性
主机保护属性标识不适合主机编程模型的类型或成员,并表示以下可靠性威胁级别增加:
在其他方面为良性。
可能会导致反序列化服务器托管的用户代码。
可能会导致反序列化服务器进程本身。
SQL Server 不允许使用带有 HostProtectionAttribute 的类型或成员,该属性指定 HostProtectionResource、SharedState、Synchronization 或 MayLeakOnAbort 的 ExternalProcessMgmt 值。 这样可防止程序集调用启用共享状态、执行同步、终止时可能导致资源泄漏或影响 SQL Server 进程的完整性的成员。
不允许的类型和成员
下表标识 SQL Server 不允许其 HostProtectionResource 值的类型和成员。
SQL Server 权限集
SQL Server 允许用户指定部署到数据库中的代码的可靠性要求。 将程序集上传到数据库中时,程序集的作者可以为该程序集指定三个权限集之一:SAFE、EXTERNAL-ACCESS 或 UNSAFE。
权限集 | 安全 | EXTERNAL-ACCESS | 不安全的 |
---|---|---|---|
代码访问安全性 | 仅执行 | 执行和访问外部资源 | 无限制 |
编程模型限制 | 是的 | 是的 | 无限制 |
可验证性要求 | 是的 | 是的 | 否 |
调用本机代码的能力 | 否 | 否 | 是的 |
SAFE 是最可靠和安全的模式,并且在允许的编程模型方面也具有相关的限制。 SAFE 代码具有较高的可靠性和安全功能。 给 SAFE 程序集授予了足够的权限,以便运行、执行计算以及访问本地数据库。 SAFE 程序集需要具有可验证的类型安全性,并且不允许调用非托管代码。
EXTERNAL-ACCESS 提供中间安全选项,允许代码访问数据库外部的资源,但仍具有 SAFE 的可靠性和安全性。
UNSAFE 用于仅能由数据库管理员创建的高度受信任的代码。 这类信任代码没有代码访问限制,可以调用非托管(本机)代码。
SQL Server 使用主机级代码访问安全策略层设置主机策略,该策略根据 SQL Server 目录中存储的权限集授予这三组权限之一。 在数据库内运行的托管代码始终获取这些代码访问权限集中的一个。
编程模型限制
SQL Server 中托管代码的编程模型需要函数、过程和类型,这些函数、过程和类型不需要在多个调用之间使用状态,也不需要跨多个用户会话共享状态。 而且,如前文所述,共享状态的存在可导致能够影响应用程序的可伸缩性和可靠性的严重异常。
鉴于这些注意事项,SQL Server 不允许使用静态变量和静态数据成员。 对于 SAFE 和 EXTERNAL-ACCESS 程序集,SQL Server 在 CREATE ASSEMBLY 时间检查程序集的元数据,如果发现使用静态数据成员和变量,则无法创建此类程序集。