【发布时间】:2016-11-25 09:43:35
【问题描述】:
因此,我正在尝试更改程序的设计以防止 SQL 注入,通过将 TextBoxes 与预设字符串连接来查看 SQL 字符串是如何产生的。
我在 DB2 数据库上使用 ODBC 驱动程序。
问题是,它在某些情况下有效,而在其他情况下则无效。
让我举个例子:
旧代码:
App.Comando.CommandText = "SELECT NOMUSU, CodEmp FROM DB.Users WHERE CODUSU = '" + txt_usuario.Text + "' AND PASUSU = '" + txt_password.Password + "'";
新代码:
App.Comando.CommandText =
"SELECT NOMUSU, CodEmp FROM DB.Users WHERE CODUSU = ? AND PASUSU = ?";
App.Comando.Parameters.AddWithValue("@codusu", txt_usuario.Text);
App.Comando.Parameters.AddWithValue("@pass", txt_password.Password);
这个效果很好。
但是,这个,没有。不会抛出任何错误,只是看起来空空如也。
旧代码:
App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = '" + marca + "'";
新代码:
App.Comando.CommandText = "SELECT CODMAR FROM DB.Marcas AS MARCAS WHERE DESMAR = ?";
App.Comando.Parameters.AddWithValue("@marca", marca);
以备不时之需,
string marca = txt_marca.Text.Trim().ToUpper();
在这种情况下,新代码不起作用,旧代码起作用。我一直在拔头发,这毫无意义。
感谢您的宝贵时间!
【问题讨论】:
-
App.Comando.Parameters.AddWithValue("@desmar", marca);? -
@artm 是的,marca 被预先定义为文本框的修剪顶部文本。应该提到
-
我的意思是在
AddWithValue中使用@desmar而不是@marca -
@artm 并不重要,它只是一个名称。 ODBC 不接受文本查询中的命名参数。另外,如果您查看第一个,密码在数据库中称为 pass in param 和 PASUSU。它仍然有效。不过我会试一试,因为你永远不会知道 C#。干杯。
-
不起作用的情况下,FROM子句的内容不同;旧代码:DB.Marcas;新代码:META3.MARCAS。这是故意的吗?