Snowflake cloud data platform 雪花动态SQL:引用参数

Snowflake cloud data platform 雪花动态SQL:引用参数,snowflake-cloud-data-platform,Snowflake Cloud Data Platform,基于雪花文档: 如SQL注入(在本主题中)所述,使用动态SQL时要小心防范攻击。 创建存储过程。此过程允许您传递表名并获取该表中的行数(相当于从表名中选择计数(*)): 提供的示例看起来不安全:“从”+表名称中选择计数(*)-简单字符串串联 因此,可以运行如下代码: CALL get_row_count('TAB'); -- intended use CALL get_row_count('(SELECT * FROM TAB UNION ALL SELECT * FROM TAB) s

基于雪花文档:

如SQL注入(在本主题中)所述,使用动态SQL时要小心防范攻击。

创建存储过程。此过程允许您传递表名并获取该表中的行数(相当于从表名中选择计数(*)):

提供的示例看起来不安全:
“从”+表名称中选择计数(*)-简单字符串串联

因此,可以运行如下代码:

CALL get_row_count('TAB');    -- intended use
CALL get_row_count('(SELECT * FROM TAB UNION ALL SELECT * FROM TAB) s'); -- subquery

第一个想法是通过使用
TABLE/IDENTIFIER
函数来运行代码(在工作表中看起来像):

作为程序的一部分:

var sql_command = "SET TABLE_NAME = " + TABLE_NAME + "; SELECT COUNT(*) FROM TABLE($TABLE_NAME);";
但它不会起作用,因为:

存储过程GET_ROW_COUNT中的执行错误:不支持单个API调用中的多个SQL语句;每个语句使用一个API调用


使用
表/标识符
和绑定变量:

create or replace procedure get_row_count(table_name VARCHAR)
returns float 
not null
language javascript
as
$$
var row_count = 0;
// Dynamically compose the SQL statement to execute.
// Note that we uppercased the input parameter name.
var sql_command = "select count(*) from TABLE(:1)";
// Run the statement.
var stmt = snowflake.createStatement(
       {
       sqlText: sql_command,
       binds: [TABLE_NAME]
       }
    );
var res = stmt.execute();
res.next();
row_count = res.getColumnValue(1);
return row_count;
$$
;
电话:

问题:

  • 是否可以以某种方式将多个语句作为一个批处理(
    snowflake.createStatement
    )运行

  • 在JS中是否有一个安全引用name的选项,排序如下:

    var sql\u command=“从”+FUNC(表名称)中选择计数(*)

  • 表和绑定值方法是否存在任何潜在缺陷


  • Re:批处理执行,你可以自己执行:
    this.executeMany=(s)=>s.split(“;”).map(sqlText=>snowflake.createStatement({sqlText}).execute())
    @waldente谢谢,我会查出来的。它们是否在相同的上下文中(即,如果其中一个语句是
    SET var…
    下一个查询是否可以使用它?是的。例如,您可以执行:
    executeMany('SET x=1;select$x')
    var sql_command = "SET TABLE_NAME = " + TABLE_NAME + "; SELECT COUNT(*) FROM TABLE($TABLE_NAME);";
    
    create or replace procedure get_row_count(table_name VARCHAR)
    returns float 
    not null
    language javascript
    as
    $$
    var row_count = 0;
    // Dynamically compose the SQL statement to execute.
    // Note that we uppercased the input parameter name.
    var sql_command = "select count(*) from TABLE(:1)";
    // Run the statement.
    var stmt = snowflake.createStatement(
           {
           sqlText: sql_command,
           binds: [TABLE_NAME]
           }
        );
    var res = stmt.execute();
    res.next();
    row_count = res.getColumnValue(1);
    return row_count;
    $$
    ;
    
    CALL get_row_count('TAB'); --works
    CALL get_row_count('(SELECT * FROM TAB UNION ALL SELECT * FROM TAB) s');
    -- SQL compilation error: syntax error line 1 at position 0 unexpected '('.