将 CLR 用于正则表达式是否比使用外部脚本更安全?

ate*_*evm 3 sql-server regular-expression sql-clr python external-scripts

问题

主要问题我们需要在MS SQL Server 2019上使用正则表达式,能力至少达到POSIX正则表达式的水平。

可能的解决方案

这个来自 stackoverflow 的问答正确地得出结论,如果您的查询必须依赖正则表达式,您应该使用 CLR。这篇 Readgate文章详细阐述了这种方法。所以我和我的一位同事提出了这个解决方案,但我的另一位同事断然表示,在这里使用 CLR 会给安全性和稳定性带来巨大风险,而使用外部脚本(Python 或 R)更安全。

这似乎是一个可疑的说法,因为CLR 中的用户代码是可以管理的,所以也许正好相反,但我没能说服我的同事。

在我绝望中写的另一个问题中,因为我被迫使用外部脚本并且仍然产生一个极快的查询。SQLpro 用户在他的评论中指出:

就安全性而言,使用 Python 或 R 可能比使用 CLR 更糟糕!

我倾向于相信。

问题

所以我有两个问题:

  1. 这正则表达式的解决方案更安全的外部脚本或基于CLR(如描述这里)?为什么?

  2. 我还建议在同一个 Windows Server 上运行 python 代码(必须是同一个服务器,因为策略)但在操作系统上安装了 python intrepeter。因为结果以任何一种方式导出到 CSV 文件中并存储在 SQL Server 中。那么我就可以使用 Python 的多处理模块来实现正确的性能。答案是相同的,在 SQL Server 中运行 Python 比在外部应用程序中更安全。这也是一个有问题的说法。

Sol*_*zky 5

我的另一位同事断然表示,在这里使用 CLR 会对安全性和稳定性构成巨大风险

好吧,您的同事绝对是错误的(除非他们可以提供此类声明的实际证据)。

安全

自从 SQLCLR 在 SQL Server 2005 中引入以来,人们一直在说它“不安全”。但是,我还没有看到有人真正证明它确实不安全。我见过的唯一假设的“证据”是有人加载了一个将文件写入磁盘的程序集,并声称由于它可以写入磁盘,因此这是一个安全漏洞。但是,这是一个错误的主张,因为:

  1. 此人已获得创建程序集的权限
  2. 程序集已经有权通过TRUSTWORTHY启用或使用签名/证书来访问外部资源。

如果您为了 a) 创建和 b) 执行所需的代码以使其看起来像是获得了提升的权限,那么这不是获得提升的权限的证据。

SQLCLR 并非天生不安全。当然,它可能会被错误地使用以意外允许某人获得提升的权限等,但它本身是安全的。而且,仅仅通过EXECUTE AS 'dbo'在存储过程或函数中使用就很容易引入安全漏洞,这就是纯 T-SQL。

下面是我写的几篇关于 SQLCLR 安全主题的文章:

话虽如此,在使用正则表达式的上下文中,SQLCLR 和外部脚本都是“安全的”(假设您不允许用户临时访问以提交他们想要的任何随机 Python 代码)。

可用性

这是一个主要区别:外部脚本通过存储过程执行。意思是,您可以对单个值执行 RegEx。如果可以将 RegEx 函数集成到SELECTand/orWHERE子句中(我知道您可以传入查询并返回结果集),那么它充其量是笨重的,当然也不容易维护。而使用 SQLCLR,您可以创建标量函数和表值函数,这些函数和表值函数很容易集成到适当的基于集合的解决方案的查询中(请记住:不进行任何数据访问的正确编码的 SQLCLR 标量函数可以参与并行计划)。

如果您想要 RegEx 函数而无需编译任何东西,在我编写的 SQLCLR 库SQL# (SQLsharp)的免费版本中有很多可用的函数。


有关使用 SQLCLR 的更多信息,请访问我的网站:SQLCLR 信息