在SQL Server中使用CLR是否有任何特定的安全或性能风险?
在SQL Server中使用CLR是否有任何特定的安全或性能风险?
Answers:
正如Remus指出的那样,这个问题太笼统,无法获得答案,因为答案取决于要使用什么功能以及如何使用它的上下文。
关于“安全性”:
如果您要询问在标PERMISSION_SET = SAFE
有的程序集中可以做的任何事情,那么我没有发现任何问题。而且,SQLCLR比使用xp_cmdshell
或出色的(那是讽刺的)sp_OA*
过程(甚至扩展存储过程,甚至是扩展存储过程,但希望没有人再创建这些过程)“更安全” 。
如果您想逐步了解“ SAFE”的实际含义,请参阅本文:SQLCLR级别3:安全性(常规和SAFE程序集)的阶梯(需要免费注册)。
如果您询问在标PERMISSION_SET = EXTERNAL_ACCESS
有的程序集中可以执行的任何操作,那么根据所使用的功能,当然也存在风险。如果编写一个例程来读取目录和文件名(即只读),那么这只是应该看到和不看到什么的问题。如果您正在编写允许删除文件的代码,则风险会增加。但是,可以与外部资源来实现由控制:
如果您询问在标有的程序集中可以执行的任何操作 PERMISSION_SET = UNSAFE
,这是开放式的。许多功能仅在UNSAFE组件中可用,因为它们是稳定性和/或一致行为的问题,而不是安全性或性能。例如,在UNSAFE程序集中,可以有一个可写的静态变量。这通常不是一件好事,因为在所有会话之间共享SQLCLR类。如果您打算在所有会话中共享内存中的数据,并已针对竞争条件进行了计划(并进行了大量测试),那么您会很好,因为您期望这种行为。但是,如果您只是想要一个可写的静态变量来缓存特定会话的值,而不必再次查找或重新计算它,并且不知道其他会话正在读取该值并可能会覆盖它,那么,那将是一个问题。
但是,如果您担心有人在写注册表,而又没有实际写在注册表中的代码,那么您可能不必担心这一点;-)。
如果您想逐步了解EXTERNAL_ACCESS和UNSAFE的实际工作方式,以及设置TRUSTWORTHY ON
(非首选)与使用基于非对称密钥或基于证书的登录名之间的区别,请参阅本文:SQLCLR级别4的阶梯:安全性(外部和不安全组件)(需要免费注册)。
关于“性能”:
这完全取决于您要做什么以及如何进行。在SQLCLR 中有些事情要快得多,而有些事情要慢一些。但是,就像使用T-SQL一样,可以通过执行错误操作来执行一些简单和/或高效的任务,并使其变得复杂和/或低效。但是,就其本质而言,使用SQL CLR并非固有地较慢。
SQLCLR组件可以用三个层次的安全访问安装:SAFE | EXTERNAL_ACCESS | UNSAFE
。详细记录了此文件,请参考CREATE ASSEMBLY
和设计组件:
管理程序集安全性
您可以控制程序集在运行托管代码时可以访问.NET代码访问安全性保护的资源的数量。通过在创建或修改程序集时指定三个权限集之一来执行此操作:SAFE,EXTERNAL_ACCESS或UNSAFE。
SAFE
SAFE是默认权限集,它是限制性最强的。具有SAFE权限的程序集运行的代码无法访问外部系统资源,例如文件,网络,环境变量或注册表。SAFE代码可以访问本地SQL Server数据库中的数据,或者执行不涉及访问本地数据库外部资源的计算和业务逻辑。
大多数程序集执行计算和数据管理任务,而无需访问SQL Server外部的资源。因此,我们建议将SAFE作为组装许可集。
EXTERNAL_ACCESS
EXTERNAL_ACCESS允许程序集访问某些外部系统资源,例如文件,网络,Web服务,环境变量和注册表。只有具有EXTERNAL ACCESS权限的SQL Server登录名才能创建EXTERNAL_ACCESS程序集。SAFE和EXTERNAL_ACCESS程序集只能包含可验证类型安全的代码。这意味着这些程序集只能通过对类型定义有效的定义明确的入口点访问类。因此,它们不能任意访问该代码不拥有的内存缓冲区。此外,他们无法执行可能对SQL Server进程的健壮性产生不利影响的操作。
UNSAFE
UNSAFE使程序集可以不受限制地访问SQL Server内部和外部的资源。在UNSAFE程序集中运行的代码可以调用非托管代码。同样,指定UNSAFE允许程序集中的代码执行CLR验证程序认为类型不安全的操作。这些操作可能会以不受控制的方式访问SQL Server进程空间中的内存缓冲区。UNSAFE程序集还可能破坏SQL Server或公共语言运行时的安全系统。UNSAFE权限仅应由经验丰富的开发人员或管理员授予高度信任的程序集。只有sysadmin固定服务器角色的成员才能创建UNSAFE程序集。
对允许的CLR属性有进一步的限制,并且仅支持.Net Framework程序集的一个子集。同样,请参考链接的文档。
至于性能,最重要的想法是要记住SQL Server是一个协作的多任务环境,而CLR不是。SQLCLR代码必须Thread.BeginThreadAffinity()
在任何时间占用CPU的任何时间(包括阻塞)都必须调用。Adam Machanic在该主题上作了精彩的演讲,观看数据,更快:带SQLCLR的Microsoft SQL Server性能技术。
话题很大,问题也很模糊。SQLCLR可以执行某些其他功能无法比拟的独特任务。而SQLCLR只是SQL Server武库中的另一种武器,您可以用性能或安全性来攻击自己。阅读文档。