gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:27:42 29 4
gpt4 key购买 nike

我正在学习 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com