有什么办法可以在 flyway 中用占位符做一个准备好的陈述吗?

Is there any way to do a prepared statement with a placeholder in flyway?

如果我写这段代码就会出现,例如 Spring Boot

CREATE ROLE application WITH LOGIN PASSWORD '${password}';

然后设置

FLYWAY_PLACEHOLDERS_PASSWORD="' DROP table -- "

在开始迁移之前,flyway 会执行注入,因为提供的引号在字符串中。有没有一种方法可以使它成为准备好的语句,或者是否有一个引用函数可以用来确保正确引用该值?

对现有查询的小改进:

DO $$
DECLARE
    the_password TEXT := '${password}';
BEGIN
    EXECUTE format('CREATE ROLE application WITH LOGIN PASSWORD %L', the_password);
END
$$

使用 format%L 将为查询执行正确的转义。不关闭整个 DECLARE/BEGIN/END 块和美元引用字符串的语句将导致解析错误。

这并没有排除注入的所有可能性,但请记住这里的上下文。这是一个数据库迁移系统。我假设它不是使用不受信任的用户的任意输入来执行的。它应该只由高度信任的用户执行,这些用户有权访问具有创建角色、create/drop 表等所需权限的凭据。因此,这更像是一种防白痴练习,而不是一种安全机制。此查询可防止意外造成损坏;任何超出此范围的事情很可能是恶意的,如果用户完全绕过部署系统,则更容易实现。