您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

SQLScript 代码分析器中的限制

对继续处理器的有限支持

代码分析器对继续处理器的支持有限。继续处理器块当前未作为过程的正常部分进行分析。考虑以下示例: 示例代码create procedure wrong_proc(in tablename nvarchar(50)) as begin declare fallbackquery nvarchar(100) = 'select * from "' || escape_double_quotes(tablename) || '" where a > 5'; declare continue handler for sqlexception exec :fallbackquery; -- do some computations select 1/0 from dummy;end

代码分析器将返回在 DSQL 中使用参数 'tablename' 的结果,尽管示例可以安全注入。

如果您查看以下示例,您将看到处理器块是单独分析的: 示例代码create procedure proc(in tablename nvarchar(50)) as begin declare continue handler for sqlexception begin declare fallbackquery nvarchar(100) = 'select * from "' || escape_double_quotes(tablename) || '" where a > 5'; exec :fallbackquery; end; --do some computations select 1/0 from dummy;end

在这种情况下,代码分析器将不会返回结果,因为注入处理在处理器块本身中执行。

不支持库变量

示例代码create library libraryZ language sqlscript as begin public variable var2 varchar(10); public procedure callee_internal(in query1 varchar(20)) as begin var2 = 'i am not used'; var2 = :query1 || :query1; select var2 from dummy; end;end 在这种情况下,预期代码分析器将返回一个结果,说明不使用 'var2' 的值。但是,当前不支持与库成员变量相关的大多数检查,包括以下场景: 示例代码create library libraryY language sqlscript as begin public variable var2 varchar(10); public procedure callee_internal(in query1 varchar(20)) as begin var2 = :query1; exec var2; end;end

在这种情况下,代码分析器不会返回警告,表明动态 SQL 中使用 'query1' 但未检查。

UNCHECKED_SQL_INJECTION_SAFETY 的限制

以下问题仅限于 UNCHECKED_SQL_INJECTION_SAFETY 规则:

  1. 不会分析纯 SQL 查询。这意味着不考虑这些查询中的表达式,例如 SQL 注入的验证器。示例代码纯 SQL 中的验证器create procedure safe_dynamic_sql(in query nvarchar(500)) as begin declare escaped_query nvarchar(550); select escape_single_quotes(:query) into escaped_query from dummy; exec escaped_query;end即使该过程是注入安全的,上述示例也会返回一个结果。 如果在查询中使用 SQLScript 变量,代码分析器会假定其包含在结果中。 示例代码SQLScript 变量作为纯 SQL 的输入create procedure safe_dynamic_sql(in query nvarchar(500)) as begin declare some_value nvarchar(550); select b into some_value from some_tabe where :query = a; exec some_value;end在上面的示例中,'query' 不包含在 'some_value' 中,但视为不安全。不会进一步分析查询的输出是否可能包含(部分)SQLScript 变量输入。

  1. 也不会分析嵌套过程调用。示例代码嵌套过程调用示例create procedure escape_proc(in query nvarchar(500), out escaped_query nvarchar(600)) as begin escaped_query = escape_single_quotes(query);end create procedure safe_dynamic_sql(in query nvarchar(500)) as begin declare escaped_value nvarchar(550); call escape_proc(query, escaped_value); exec escaped_value;end在上面的示例中,代码分析器还会返回结果,因为它不分析内部程序 'escape_proc'。

  1. 结构化类型(如数组变量、行变量或表变量)也存在限制。结构化类型的变量被视为一个单位。它要么完全受未检查的输入影响,要么根本不影响。示例代码容器示例create procedure row_type_injection(in query nvarchar(500)) as begin declare r row(a nvarchar(500), b nvarchar(650)); r.a = query; r.b = escape_double_quotes(query); exec :r.b;end在上面的示例中,代码分析器将返回结果,因为行变量 'r' 被视为一个单位。由于 中的参数 'query' 直接赋给 'r.a'(无需转义),因此变量 'r' 作为一个整体被视为受输入变量的影响。因此,假定使用 'r' 任何部分的每个操作都使用 'query' 的未转义版本。