【发布时间】:2018-05-17 14:18:41
【问题描述】:
我想通过我的 c# 应用程序(使用 Connector/Net 8.0.11)将行插入 MySql 数据库。我使用命令参数来传递值是因为 - 在我的理解中 - 我不必关心任何类型的特殊字符。请在下面找到一个简化的代码示例。
MySqlCommand Cmd = new MySqlCommand("INSERT INTO testtab(TestCol1,TestCol2) VALUES(@test1,@test2)", Con);
Cmd.Parameters.AddWithValue("@test1", "12'34");
Cmd.Parameters.AddWithValue("@test2", "56");
Cmd.ExecuteNonQuery();
但“12'34”中的单引号导致异常:
“您的 SQL 语法有错误;请查看手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 1 行的 '34','56')' 附近"
我知道我根本不能使用参数,而只是将值字符串中的引号加倍......但我已经使用连接器/ODBC 构建了类似的应用程序,它们工作正常。你能帮我找出连接器/网络的诀窍吗?
【问题讨论】:
-
我更关心
near '34','56'部分。看起来 MySQL 连接器在没有正确转义的情况下是如何内联查询的。您可以尝试在其中放置一个 sql 注入查询,看看它是否有效?喜欢("@test2", "1'; DELETE FROM testtab WHERE ('1' = '1"); -
@PaulF 我的错误
-
MySql.Data.MySqlClient.MySqlHelper.EscapeString("12'34")的转义结果是12\'34但不应该是12''34吗? -
@Steve 仍然遇到像
...near '; DELETE FROM testtab WHERE (\'1\' = \'1')'这样的异常。我认为连接器并不完全内联它。 -
@m.denis 根据dev.mysql.com/doc/connector-net/en/…,您必须在添加值之前调用
Prepare()。有帮助吗?