如何使用EXPLAIN命令避免PostgreSQL中的SQL注入?

问题描述 投票:0回答:1

据我所知

EXPLAIN (ANALYZE, ...)
不接受带参数查询:

EXPLAIN (ANALYZE) SELECT * FROM mytable WHERE name = $1
会产生错误:
ERROR:  there is no parameter $1 at character 107

所以我不能使用参数绑定

db.Query(myquery, params...)

如何使用我想要的任何参数安全地运行

EXPLAIN
命令?我需要获取一个可以清理 sql 字符串的包吗?我正在构建一个程序,通过接受用户输入自动解释查询。

sql postgresql sql-injection
1个回答
0
投票

您能做的最好的事情就是创建一份准备好的声明:

PREPARE stmt(text) AS SELECT * FROM mytable WHERE name = $1;

那么你可以

EXPLAIN EXECUTE stmt('some name');

无需在语句中插入字符串即可获取执行计划。如果您不想让准备好的语句存在直到数据库会话结束,您可以

DEALLOCATE
它。

如果不想考虑参数值,可以使用

EXPLAIN (GENERIC_PLAN) SELECT * FROM mytable WHERE name = $1;

这将为您提供通用计划,并且可从 PostgreSQL v16 开始使用。

© www.soinside.com 2019 - 2024. All rights reserved.