我不是用于 client-rds-data 的 AWS 开发工具包的用户,但我从文档中推断出以下内容,以及我自己对 MySQL 的了解。
我看到接口ExecuteSqlCommandInput有一个 property 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 的典型情况。