【发布时间】: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 中一样。不能使用变量来指定变量。