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

标签 postgresql sql-injection flyway

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

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

然后设置

FLYWAY_PLACEHOLDERS_PASSWORD="' DROP table -- "

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

最佳答案

对现有查询的小改进:

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

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

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

关于postgresql - 有什么办法可以在 flyway 中用占位符做一个准备好的陈述吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40945277/

相关文章:

postgresql - CASE, WHEN, THEN 更新

database - 数据库表之间的关系

sql注入(inject) bool 语法

EXISTS block 内的 MYSQL SLEEP

java - 为什么 flyway 在设置 outOfOrder 为 true 时会产生警告信息?

flyway - Flyway 中 SCHEMA_HISTORY.execution_time 的定义是什么?

sql - 如何从 PostgreSQL 的单行数据库表中获取多行?

java - 亚马逊 RDS : is there java API for PostgreSQL?

php - Yii2 : Can I bind an array to an IN() condition in join?

java - Spring Boot、Hibernate 和 flyway 数据库问题