SQL Server 编程和宿主保护特性
在 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 的类型或成员,该属性指定 SharedState、Synchronization、MayLeakOnAbort 或 ExternalProcessMgmt 的 HostProtectionResource 值。 这样可防止程序集调用启用共享状态、执行同步、终止时可能导致资源泄漏或影响 SQL Server 进程的完整性的成员。
不允许的类型和成员
下表标识了 SQL Server 禁止其 HostProtectionResource 值的类型和成员。
SQL Server 权限集
SQL Server 能让用户指定部署到数据库的代码可靠性要求。 将程序集上传到数据库中时,程序集创建者可为该程序集指定三个权限集(SAFE、EXTERNAL-ACCESS 或 UNSAFE)其中之一。
权限集 | SAFE | EXTERNAL-ACCESS | UNSAFE |
---|---|---|---|
代码访问安全性 | 仅执行 | 执行和访问外部资源 | 非受限 |
编程模型限制 | 是 | 是 | 无限制 |
可验证性要求 | 是 | 是 | 否 |
调用本机代码的能力 | 否 | No | 是 |
SAFE 是最可靠和安全的模式,并且在允许的编程模型方面也具有相关的限制。 SAFE 代码具有高可靠性和安全性功能。 给 SAFE 程序集授予了足够的权限,以便运行、执行计算以及访问本地数据库。 SAFE 程序集需要具有可验证的类型安全性,并且不允许调用非托管代码。
EXTERNAL-ACCESS 提供了一个中间安全选项,允许代码访问数据库外部的资源,但仍具有 SAFE 的可靠性和安全性。
UNSAFE 用于仅能由数据库管理员创建的高度受信任的代码。 这类信任代码没有代码访问限制,可以调用非托管(本机)代码。
SQL Server 使用主机级别代码访问安全策略层来设置主机策略,此策略根据 SQL Server 目录中存储的权限集授予三组权限之一。 在数据库内运行的托管代码始终获取这些代码访问权限集中的一个。
编程模型限制
SQL Server 中托管代码的编程模型需要无需使用跨多个调用的状态保留或跨多个用户会话共享状态的功能、过程和类型。 而且,如前文所述,共享状态的存在可导致能够影响应用程序的可伸缩性和可靠性的严重异常。
考虑到这些因素,SQL Server 不允许使用静态变量和静态数据成员。 对于 SAFE 和 EXTERNAL-ACCESS 程序集,SQL Server 将在 CREATE ASSEMBLY 时间检查程序集的元数据,如果发现使用静态数据成员和变量,则无法创建此类程序集。