我想知道是否有一种方法可以语法化 INSERT
使用 EXECUTE
在 plpgsql
.
假设我想要一个带有多个 IF
的动态插入秒。我尝试创建如下内容
CREATE FUNCTION __a_inj(creator text) RETURNS integer
AS $query$
DECLARE ii ALIAS FOR $1;
BEGIN
EXECUTE'
INSERT INTO deleteme(name) VALUES($1) RETURNING id'
USING creator;
return ii;
END;
$query$
LANGUAGE plpgsql;
我用 select __a_inj('drop table deleteme;--');
来调用它并得到
ERROR: invalid input syntax for integer: "drop table deleteme;--" CONTEXT: PL/pgSQL function __a_inj(text) while casting return value to function's return type SQL state: 22P02
如果我替换 INSERT
符合 INSERT INTO deleteme(name) VALUES($1) RETURNING id into ii'
我明白了
ERROR: syntax error at or near "into" LINE 2: ... INSERT INTO deleteme(name) VALUES($1) RETURNING id into ii
如果函数是
CREATE FUNCTION __a_inj(creator text) RETURNS integer
AS $query$
DECLARE ii ALIAS FOR $1;
BEGIN
RETURN EXECUTE'
INSERT INTO deleteme(name) VALUES($1) RETURNING id into ii'
USING creator;
--return ii;
END;
$query$
LANGUAGE plpgsql;
我明白了
ERROR: syntax error at or near "USING" LINE 8: USING creator;
我怎样才能拥有一个动态的INSERT
与 EXECUTE
或
我想没有必要语法一。只需使用 ifs 创建 INTO 和值部分,然后使用简单的 INSERT
这对 SQL 注入(inject)攻击也有很强的抵抗力?
最佳答案
两条语句都是动态SQL(EXECUTE
),但是第二条语句有语法错误(SQL中没有INTO
子句)。您在第一条语句中收到错误,因为您插入的字符串无法转换为整数。
如果使用 USING
子句,则可以避免 SQL 注入(inject),因为它使用了带参数的语句。仅当您将用户输入字符串与 SQL 语句连接时,才会发生 SQL 注入(inject)。
关于postgresql - 如何在plpgsql中语法动态插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48444532/