postgresql - 如何在plpgsql中语法动态插入

标签 postgresql dynamic insert user-input plpgsql

我想知道是否有一种方法可以语法化 INSERT使用 EXECUTEplpgsql .

假设我想要一个带有多个 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;

我怎样才能拥有一个动态的INSERTEXECUTE

我想没有必要语法一。只需使用 ifs 创建 INTO 和值部分,然后使用简单的 INSERT这对 SQL 注入(inject)攻击也有很强的抵抗力?

最佳答案

两条语句都是动态SQL(EXECUTE),但是第二条语句有语法错误(SQL中没有INTO子句)。您在第一条语句中收到错误,因为您插入的字符串无法转换为整数。

如果使用 USING 子句,则可以避免 SQL 注入(inject),因为它使用了带参数的语句。仅当您将用户输入字符串与 SQL 语句连接时,才会发生 SQL 注入(inject)。

关于postgresql - 如何在plpgsql中语法动态插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48444532/

相关文章:

ruby-on-rails - Rails 通过连接表获取关联计数

postgresql - 奇怪的 postgres 序列行为

PHP + MySQL : dynamic table name from first query for execution of second query

sql-server-2008 - 如何在一次存储过程调用中将多条记录插入表中

mysql - 插入查询在 mysql 中不起作用

node.js - 如何使用 Node.js 和 Knex 连接到 AWS EC2 实例内的 postgresql 数据库

java - Docker + Spring Boot + Postgres-org.postgresql.util.PSQLException : The connection attempt failed

java - 动态地向 JTabbedPane 的不同选项卡中的多个 JTextAreas 添加文本?

c - 将一个元素重新添加到动态数组列表中(从内存中删除后)

sql - 加载 Oracle 数据库中的两个相关表