【问题标题】:AWS Aurora MySQL prepared statementAWS Aurora MySQL 准备好的语句
【发布时间】:2022-01-11 23:19:42
【问题描述】:

我有一个插入查询,我想使用 JavaScript V3 AWS 客户端针对 AWS Aurora MySQL 无服务器数据库执行。我正在使用数据库的数据 API。我在代码中设置了@aws-sdk/client-rds-data,我可以使用ExecuteStatementCommand 连接和执行任意SQL 查询。

我想知道的是我如何制作 SQL 准备好的语句并执行它们。我有一个INSERT 查询,其值是用户提供的。我不能只是将这些值连接到 SQL 查询中,因为它会造成 SQL 注入漏洞。

不幸的是,我在@aws-sdk/client-rds-data 包的文档中找不到如何制作准备好的语句并执行它们。

如果有人知道该怎么做,请有人解释一下。提前非常感谢!

【问题讨论】:

    标签: mysql aws-sdk-js aws-aurora-serverless aws-sdk-js-v3


    【解决方案1】:

    我不是用于 client-rds-data 的 AWS 开发工具包的用户,但我从文档中推断出以下内容,以及我自己对 MySQL 的了解。

    我看到接口ExecuteSqlCommandInput 有一个属性sqlStatements,它允许多个SQL 语句用分号分隔。这排除了查询参数的使用,因为在 MySQL 中,您不能对包含多个 SQL 语句的字符串使用 prepare()。

    ExecuteStatementCommandInput 有一个属性sql(单个语句)和一个属性parameters,它是一组标量参数(即每个标量对应于sql 字符串中的一个参数占位符)。这应该允许您运行参数化 SQL 查询。


    关于您的评论:当您说要使用准备好的语句来避免 SQL 注入漏洞时,我假设您了解准备好的语句如何防止这些漏洞。

    事实上,单独使用准备好的语句并不是一种防御。您必须使用查询参数将动态输入与 SQL 查询分开。碰巧使用查询参数需要使用prepared statements,所以人们说“使用prepared statements”来防御sql注入,而他们应该说“使用查询参数,这意味着你必须使用prepared statements。”

    关于使用带有查询参数的 SQL 的教程非常丰富。这是 Node.js 的一个:https://www.veracode.com/blog/secure-development/how-prevent-sql-injection-nodejs

    AWS 开发工具包的调用约定不同,但概念相同。我只找到 AWS SDK 的参考文档,没有代码示例或面向任务的文档。这令人失望,但不幸的是 AWS 的典型情况。

    【讨论】:

    • 您好,谢谢您的回答。我不太熟悉 MySQL 查询中的占位符。你能给我举个这些占位符的例子吗?提前致谢。
    猜你喜欢
    • 2011-09-16
    • 2012-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多