在Postgresql存储过程中使用准备好的语句或动态命令?

Use prepared statement or dynamic command in Postgresql stored procedure?

提问人:niks 提问时间:5/10/2019 更新时间:5/10/2019 访问量:935

问:

我正在学习Postgreslq,我对这个代码示例有疑问:

CREATE OR REPLACE PROCEDURE CreateProject(
IN projectName VARCHAR(45),
IN projectYear SMALLINT)
LANGUAGE plpgsql
AS $$
BEGIN
--     PREPARE addProject (VARCHAR(45),SMALLINT) AS
--     INSERT INTO projects (projectName, year) VALUES ($1, $2);
--     EXECUTE addProject(projectName, projectYear );

    EXECUTE 'INSERT INTO projects (projectName, year) VALUES ($1, $2)'
    USING projectName,projectYear;
END $$;

我正在尝试编写对SQL注入安全的存储过程。来自 Mysql,我知道我必须使用带有参数的预处理语句。在Postgresql中,它不允许(注释代码),另一方面,如果我使用动态命令,它可以工作。有人可以解释一下,为什么在这种情况下不能使用准备好的语句?

PostgreSQL 存储过程 准备语句 SQL 注入

评论


答:

2赞 Kaushik Nayak 5/10/2019 #1

执行计划是为 PL/PgSQL 准备和缓存的,它会自动发生。因此,为了优化,没有必要在PL / PGSQL中使用(正如你所看到的,你不能)。PREPARE

如果使用动态参数并使用串联来追加它们而不是参数化,则可以进行 SQL 注入。但是,由于您正在运行没有动态列/表的简单插入,因此不需要。EXECUTE

CREATE OR REPLACE procedure CreateProject(
   IN projectName  VARCHAR(45),
   IN projectYear  SMALLINT  )
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO projects (projectName, year) VALUES ($1, $2);
END $$;

演示