我目前正在尝试在我的asp.net应用程序(用VB编写)中参数化我的MySql查询。
参数化之前的查询看起来像这样,带有变量表名:
Dim mySqlCmd As New MySqlCommand("SELECT * FROM `p" & tableName & "` WHERE StepNum='3'", mySqlConn)
这很好用。但是,我想参数化表名以防止可能的攻击。</ p>
新查询如下所示:
Dim mySqlCmd As New MySqlCommand("SELECT * FROM @tableName WHERE StepNum='3'", mySqlConn)
mySqlCmd.Parameters.AddWithValue("@tableName", "`p" & tableName & "`")
问题似乎是由addwithvalues错误地解析我的反引号引起的。此查询的错误消息是:
您的SQL语法有错误;检查手册 对应于您的MySQL服务器版本,以便使用正确的语法 靠近&#39; \`ptableName \`&#39;在哪里StepNum =&#39; 3&#39;&#39;在第1行
(注意,由于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解析不喜欢反引号。
答案 0 :(得分:-1)
您不能像这样使用表名的参数。
为了安全起见,从数据库中获取表的名称,向用户提供这些表(例如在下拉列表中),然后在将表名插入查询字符串之前验证表名。