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

标签 postgresql stored-procedures prepared-statement sql-injection

我正在学习 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 注入(inject)安全的存储过程。来自 Mysql,我知道我必须使用带参数的准备语句。在 Postgresql 中,它不允许(注释代码),另一方面,如果我使用动态命令,它就可以工作。有人可以解释一下,为什么在这种情况下不能使用准备好的语句?

最佳答案

执行计划是为 PL/PgSQL 准备和缓存的,它是自动发生的。因此,没有必要为了优化而在 PL/PGSQL 中使用 PREPARE(如您所见,您不能这样做)。

如果您使用动态参数并使用连接来附加它们而不是参数化,那么 SQL 注入(inject)是可能的。但是,由于您正在运行没有动态列/表的简单插入,因此不需要 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 $$;

DEMO

关于postgresql - 在 Postgresql 存储过程中使用准备好的语句或动态命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56072348/

相关文章:

sql - 查询 - 在一系列时间戳中查找空间隔

mysql - 在存储过程中查找输入值的最小值/最大值,MySQL

sql - 在 SQL Server 的 IN 子句中调用存储过程?

java - 使用准备好的语句和用户输入更新数据

c++ - 嵌入式 MySQL 是否支持 Prepared 语句

java - 如何向本地系统或服务器中的数据库授予 postgresdb 权限

postgresql - 使用 RETURNING 子句返回 PostgreSQL 中最后插入行的 ID

json - 如何修改 PostgreSQL JSONB 数据类型中的单个属性值?

php - 调用存储过程Mysql时命令不同步

php - 获取mysqli结果时如何在while循环内抛出异常?