【问题标题】:How to parameterize a backtick in a MySql query?如何在 MySql 查询中参数化反引号?
【发布时间】:2018-02-09 14:36:55
【问题描述】:

我目前正在尝试在我的 asp.net 应用程序(用 VB 编写)中参数化我的 MySql 查询。

查询,在参数化之前,看起来像这样,带有一个可变的表名:

 Dim mySqlCmd As New MySqlCommand("SELECT * FROM `p" & tableName & "` WHERE StepNum='3'", mySqlConn)

这很好用。但是,我想参数化表名以保护它免受可能的攻击。

新查询如下所示:

 Dim mySqlCmd As New MySqlCommand("SELECT * FROM @tableName WHERE StepNum='3'", mySqlConn)
 mySqlCmd.Parameters.AddWithValue("@tableName", "`p" & tableName & "`")

问题似乎是由于 addwithvalues 错误地解析了我的反引号引起的。此查询的错误消息是:

您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行的 ''\`ptableName\`' WHERE StepNum = '3'' 附近

(请注意,由于 stackoverflow 格式的原因,我必须使用两个反斜杠 (\) 才能让它们在此处仅显示一个。)

我尝试了几种不同的方式来格式化我的查询:

 Dim mySqlCmd As New MySqlCommand("SELECT * FROM `@tableName` WHERE StepNum='3'", mySqlConn)
 mySqlCmd.Parameters.AddWithValue("@tableName", "p" & tableName)

 Dim mySqlCmd As New MySqlCommand("SELECT * FROM @tableName WHERE StepNum='3'", mySqlConn)
 Dim tableNameVar As String = "`p" & tableName & "`"
 mySqlCmd.Parameters.AddWithValue("@tableName", tableNameVar)

 Dim mySqlCmd As New MySqlCommand("SELECT * FROM @tableName WHERE StepNum='3'", mySqlConn)
 mySqlCmd.Parameters.AddWithValue("@tableName", "p" & tableName)

它们都不起作用,并且都给出了稍微不同的 mysql 错误,但所有这些错误的主要驱动点似乎是我需要反引号来指示表名,并且 addwithvalues 解析不喜欢反引号。

【问题讨论】:

  • 我相信你做不到,实际上参数的想法是你不做那个。这就是为什么你的 tableName 被转换成一个字符串,所以你不能在那里注入脚本。我会打开我可以添加yourTable Drop Table yourTable 并删除你的表
  • 您不能使用参数作为标识符。它们仅用于价值。这就像在 VB 中一样。不能使用变量来指定变量。

标签: mysql sql asp.net vb.net


【解决方案1】:

你不能像这样对表名使用参数。

为了安全起见,请从数据库中获取表的名称,将其提供给用户(例如,在下拉列表中),然后在将表名插入查询字符串之前对其进行验证。

另外,Can we stop using AddWithValue() already?

【讨论】:

  • 嗯,在这里向用户显示数据库中的表列表不是一个可行的选择。感谢您的 addwithvalues 文章,我不知道这可能会导致问题。
  • @JonW 在这种情况下,在代码中插入表名会受到 SQL 注入的影响吗?
  • 实际上这个特定的查询根本不容易受到注入攻击。我实际上是在此之前从 MySql 中的一个字段中获取 tablename 变量,当它最初被添加时它被正确参数化,我只是有一个新员工通过我的代码,参数化我的查询,因为我懒得做所以,这让他熟悉了我的项目。所以当他问为什么它不起作用时,我很好奇并提出了这个问题。
  • 注入攻击只是使用参数的原因之一 (1)。还有由字符串连接、代码可维护性和意外数据类型转换导致的可怕、难以阅读的代码。最后一个可以像注入攻击一样破坏一些数据库。如果用户在某种程度上参与其中,您还可以使用查找将 UI 友好名称转换为表名称 (Customers --> tbl_CUST_FOO9) @JonW
猜你喜欢
  • 2020-02-28
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
相关资源
最近更新 更多