【问题标题】:Alternative to prepared statement when using AWS RDS proxy使用 AWS RDS 代理时准备好的语句的替代方案
【发布时间】:2021-02-24 02:06:27
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否发现了更多关于此的信息?我相信我遇到了完全相同的问题。我只是设置了一个 RDS 代理,它根本没有帮助,因为我所有的数据库连接都是会话固定的。我想这是因为 Knex 使用了准备好的语句。
  • @lastmjs 我决定暂时不使用 RDS 代理。我通过增加 lambda 函数的内存解决了连接时间问题。我在某处发现当你增加内存时你会得到更多的 CPU
  • @ClémentBisaillon 在使用 lambdas 直接连接到数据库时,您没有遇到性能问题吗?我认为这就是人们首先使用代理的原因

标签: amazon-web-services aws-lambda amazon-rds amazon-rds-proxy


【解决方案1】:

我遇到了同样的问题。我为 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 代理启用日志(高级配置),它也会非常有帮助。启用后,您可以查看为什么您的会话被固定在 Cloud Watch 指标中。

【讨论】:

    【解决方案2】:

    我尝试将?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
    

    我看到固定的prepared_statements上有一个下降。

    我尚未采用该解决方案,因为我仍在调查 RDS 代理是否仍然是我们用例的最佳选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多