使用 AWS RDS 代理时准备语句的替代方案

Clé*_*lon 8 amazon-web-services amazon-rds aws-lambda amazon-rds-proxy

RDS proxy 的文档中指出,当应用程序使用准备好的语句时,连接会自动固定:

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

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

小智 0

我有同样的问题。我对 Postgresql RDS 使用 RDS 代理。为了连接到 RDS 代理,我使用了 gem 'pg' (ruby 上的项目)。

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

以及准备好的声明的问题。如果 rds 代理看到如下查询,则会固定会话:

SELECT  "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
Run Code Online (Sandbox Code Playgroud)

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

SELECT  "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Run Code Online (Sandbox Code Playgroud)

因此,当我稍微更改库代码时,我解决了这个问题。如果您为 rds 代理启用日志(高级配置),它也会非常有帮助。启用后,您可以查看为什么您的会话被固定在 Cloud Watch Metrics 中。