使用AWS RDS代理时准备好的声明的替代方案



它在RDS代理的文档中说,当应用程序使用准备好的语句时,连接会自动固定:

准备好的语句会导致代理锁定会话。无论准备的语句使用SQL文本还是二进制协议,此规则都适用。(https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy.html)

在使用RDS代理时,我应该如何保护我的应用程序免受SQL注入的影响?我使用这个服务是为了在我的微服务中更快地与数据库连接,所以我希望连接能够被重用。

我也遇到了同样的问题。我为Postgresql RDS使用了RDS代理。为了连接到RDS代理,我使用了gem"pg"(ruby上的项目(。

起初,当连接建立时,我禁用了对数据库的一些初始查询(如设置时区等(。

还有准备好的陈述的问题。如果rds代理看到如下查询,则会将会话固定:

SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]

因此,如果rds代理看到该查询,则会话将被固定。但如果你以这种方式进行查询,会话将不会被固定:

SELECT  "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1

所以,当我稍微更改我的库代码时,我就解决了这个问题。此外,如果您为rds代理启用日志(高级配置(,这将非常有帮助。启用后,您可以看到为什么您的会话被固定在云监控指标中。

我尝试将?binary_parameters=yes&binary_parameters=yes附加到连接字符串。

postgres://user:password@rds-proxy.proxy-dgi349gjv95j.us-east-1.rds.amazonaws.com:5432/db_name?binary_parameters=yes

我看到钉住的CCD_ 3上有一个水滴。

我还没有遵循该解决方案,因为我仍在调查RDS代理是否仍然是我们用例的最佳选择。

最新更新