【问题标题】:Mysql Stored Procedure: match the column rule to retrieve valueMysql存储过程:匹配列规则以检索值
【发布时间】:2019-11-01 02:51:10
【问题描述】:

我有一个存储过程,它可以根据与ColumnRule 匹配的输入参数来检索ColumnProperty

例如,

我将执行以下操作以将ColumnProperty 作为字符串(短)。但问题是当使用WHERE过滤ColumnRule时,检索到的值是字符串,最后得到未知类型。

CALL `testing-spGetColumnType`('varchar(11)', @outputProperty);
select @outputProperty;

DELIMITER $$
CREATE PROCEDURE `testing-spGetColumnType`(IN pColumnType varchar(50),OUT pColumnProperty varchar(50))
BEGIN

    SELECT ColumnProperty FROM model_column_type where pColumnType like replace(ColumnRule, 'variable', pColumnType) into pColumnProperty;
    
    SELECT IFNULL(pColumnProperty,'unknown type') into pColumnProperty;

END$$
DELIMITER ;

样本表:

【问题讨论】:

  • 它不会将ColumnRule中的代码作为SQL表达式执行。它只是一个字符串,它与pColumnType 匹配。
  • echoing Barmar:来自ColumnRule 列的值是一个。字符串值看起来像 SQL 表达式并不重要。正如它在 SELECT 语句中所引用的那样,它只是字符的集合。为了得到一个解释为 SQL 文本的值(并打开一个潜在的巨大 SQL 注入漏洞),我们需要动态生成 SQL。我们可以将值 n 合并到一个字符串中,然后将字符串作为 SQL 语句执行,PREPARE、EXECUTE、DEALLOCATE ... MySQL 参考:dev.mysql.com/doc/refman/8.0/en/…

标签: mysql stored-procedures where-clause operator-keyword


【解决方案1】:

当 WHERE 子句中的条件针对 stringShort 行进行评估时,将 'varchar(11)' 作为参数,它相当于

  WHERE 'varchar(11)' 
   LIKE '%varchar% and SUBSTRING_INDEX(SUBSTRING_INDEX(varchar(11),''('',-1),'')'',1) < 50' 

LIKE 比较的结果将为 FALSE。

该行中ColumnRule

%varchar% and SUBSTRING_INDEX(SUBSTRING_INDEX(variable,'(',-1),')',1) < 50

是一个。它看起来像 SQL 文本并不重要。在 SELECT 语句的上下文中,它只是一个字符串。这是一个字符串。它不是对标识符、SQL 函数或布尔运算符的引用。

如果ColumnRule 的值为

,我们将得到相同的结果
%varchar% one two buckle my shoe

要让字符串值被视为 SQL 文本,我们可以使用动态准备的 SQL。

在 MySQL PROCEDURE 的上下文中,我们可以动态创建 SQL 文本并将其存储为字符串,然后执行该字符串,如下所示:

 SET @foo = ' foo, bar' ; 
 SET @sql = CONCAT('SELECT ',@foo,' FROM mytab',' ORDER BY ',@foo); 
 PREPARE stmt FROM @sql;
 EXECUTE stmt;
 DEALLOCATE PREPARE stmt;

请注意:如果我们动态创建 SQL 文本并包含潜在的不安全值,我们可能会打开一个巨大的 SQL 注入漏洞,例如 Little Bobby Tables https://xkcd.com/327/

MySQL 参考https://dev.mysql.com/doc/refman/8.0/en/sql-syntax-prepared-statements.html

【讨论】:

    猜你喜欢
    • 2017-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    相关资源
    最近更新 更多