【问题标题】:How unsafe can be the usage of "Unsafe" in SQL CLR?SQL CLR 中“不安全”的使用有多不安全?
【发布时间】:2017-12-17 07:29:51
【问题描述】:

由于客户端无法访问 SQL CLR 程序集,因此我们只需要担心我们自己的错误。小心使用,“不安全”可以是相当安全的。你怎么看?

【问题讨论】:

  • 我认为你的问题太模糊了,只会发表非法意见。
  • 肖恩是正确的。风险无处不在,小概率事件无时无刻不在发生。只有您和您的组织才能确定什么是可接受的风险。
  • 我的意思是,一个程序集被标记为“不安全”这一事实并不意味着它真的不安全或我们的用法是——它只是意味着我们是靠我们自己的。我错了吗?
  • 我相信即使使用“安全”程序集也可能发生低概率事件。可能会出现错误。
  • 那么它是否使“不安全”的概念变得模糊?

标签: sql .net sql-server clr sqlclr


【解决方案1】:

“不安全”并不总是与谁在执行代码有关,而是与正在执行什么代码和/或如何编码有关。 UNSAFE 程序集允许代码,即使在理想/正确使用中,也可能破坏 SQL Server 的稳定性,或允许安全漏洞,或允许奇怪/意外行为。例如,使用TimeZoneInfo 转换时区之间的时间需要不安全,即使它应该是一个稍微简单的计算。问题是在该代码库的某个地方存在导致内存泄漏的东西。尝试批量更新日期列的人已经经历过这种情况。 UNSAFE 也用于可能安全但未经 Microsoft 验证的代码,因此无法保证。就使用不受支持的 .NET Framework 库而言,这些库不仅不能保证按预期工作(或者没有内存泄漏或线程安全),而且甚至不能保证它们可以在任何未来的 .NET Framework 更新中工作(例如:ServiceModel 在 .NET Framework v 4.0 中成为混合模式,因此从 SQL Server 2012 开始,任何将 ServiceModel 导入 SQL Server 2005、2008 或 2008 R2 的人都无法再将其导入,因此必须如果他们想升级 SQL Server,重写一堆代码。

但回到问题,当你控制代码时,它有多不安全?您可能不允许任何安全漏洞,但由于共享内存(即静态变量)/同步问题确实难以重现和调试,您肯定会陷入内存泄漏和“奇怪”行为的情况。例如,以下是关于 DBA.StackExchange 的一个问题,该问题仅在系统开始更频繁地调用 SQLCLR 函数时才开始发生。问题是由于使用静态变量来存储声明,然后多个会话覆盖值并在从该变量中读取时获取意外值:

SQLCLR assembly throws error when multiple queries run simultaneously

可以“安全地”使用UNSAFE 程序集吗?当然。如果您使用静态变量进行缓存,并在它为空时重新加载,那应该没问题。或者,可能加载不受支持的 .NET Framework 库(几乎总是必须标记为 UNSAFE),但只在其中使用“安全”方法(仅仅因为程序集的代码是“不安全”并不意味着永远会执行“不安全”的代码)。缺点是:1) 你不知道所有这些库在做什么,即使你确实在reference.microsoft.com 上查看了其中的一些; 2) 你仍然面临这样的可能性,即库会在某个时候更新为混合模式,然后你必须重写所有内容。

【讨论】:

  • 为什么在服务器上使用的 .Net Framework 库中可能存在内存泄漏,但在 SQL Server 中使用这些 dll 时却不是这样?
  • @Lorin_F 我不会说内存泄漏发生在任何地方都是“好的”。理想情况下,它们永远不会发生。但是,SQL Server 的 CLR 主机受到高度限制,不仅与内存泄漏有关,而且我怀疑这与 SQL Server 对内存的保护程度(它需要尽可能多的物理内存)以及缺乏内置-in 修复内存消耗:Windows 应用程序在退出时销毁其 AppDomain。如果内存超过指定数量,ASP.NET 可以设置为回收。如果没有足够的内存,SQL Server 只会卸载 AppDomain。骑自行车会降低性能。
  • 谢谢鲁茨基先生。无论如何,鉴于系统库被数百万人使用,假设与它们有关的所有问题都是已知问题并且通常都已解决,难道不安全吗?
  • @Lorin_F 对于任何地方的任何软件,我永远不会说“与它们有关的所有问题都是已知问题,并且通常都已解决”。即使有 10 亿人使用图书馆,也不是所有问题都是已知的,也不是所有已知问题都得到解决。即使解决了,这并不意味着更新的代码无处不在。不过,请记住上下文是在 SQL Server 中运行的。有些操作不是错误,但在这个特定环境中仍然很危险,尤其是共享内存和多线程问题。一些库中可能还存在国际化问题。
猜你喜欢
  • 2011-06-11
  • 2019-05-31
  • 1970-01-01
  • 2017-10-20
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多