【发布时间】:2021-12-06 11:18:31
【问题描述】:
是否可以防止 SQL Server 一次执行多个语句
例如,T-SQL 将毫无问题地执行如下语句
SELECT '1' UPDATE x SET y = 'z'
因此,如果您有一个字符串变量并且您只希望执行一个 SELECT,是否可以验证该字符串仅包含一个 SELECT 语句而不搜索所有可能的关键字
【问题讨论】:
-
如果您试图允许任意代码但防止恶意使用,请注意有很多恶意的事情可以只写一个
SELECT(例如笛卡尔将一个中等大小的表加入到自身应用了TABLOCKX提示20 次)。但是,如果您接受这种风险,您最好的防御就是在只有SELECT权限的帐户下运行它。那么你就不必构建一个复杂的解析器等了。 -
看来,老实说,您在这里有一个XY Problem。你为什么要让你的用户首先将任意 SQL 字符串输入到要执行的变量中?
-
我们知道允许运行任意 SQL 的含义,但在不深入细节的情况下,您可以假设这是我们现在必须忍受的约束。
-
可以使用T-SQL script DOM library 验证应用程序代码中包含单个 SQL 语句的字符串变量,但无法通过服务器配置设置禁止多语句批处理。那会破坏很多东西。
-
这通常是要解决的错误问题;单个语句本身可能会引起很多麻烦。如果您随后必须询问如何防止多语句批处理,那么您“意识到”其含义的声明很容易被证明是错误的,因为这些不是问题-您必须有一种万无一失的解析方式 T -SQL 语句将它们与“安全”和“允许”模式相匹配。 (Per Dan,你确实需要完整的解析器——只是你可以使用 cmets 进行的恶作剧需要它。)
标签: sql-server tsql