【问题标题】:Prevent multiple T-SQL statements in a string防止字符串中有多个 T-SQL 语句
【发布时间】: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


【解决方案1】:

您应该更改用户的角色以仅包含publicdb_datareader,并取消他们的任何其他角色。

那么他们唯一能做的就是SELECT查询。

【讨论】:

    猜你喜欢
    • 2020-09-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-24
    • 2011-04-10
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多