【问题标题】:Cant insert character values from textbox to database无法将字符值从文本框插入到数据库
【发布时间】:2013-07-29 12:14:55
【问题描述】:

尝试从文本框插入数据库,但它只接受整数而不接受字符 - 可能是什么问题?

 string sCMD = string.Format("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES({0},{1},'0',{2},{3},{4})"
            ,txtText1.Text, txtText2.Text, txText3.Text, txtText4.Text, txtText5.Text);

在此上下文中不允许使用名称“”。有效表达式是常量、常量表达式和(在某些情况下)变量。不允许使用列名。

【问题讨论】:

  • 数据库表中的列是什么?
  • 想象一下如果用户在您的文本框中输入some"valu"e 会发生什么。
  • 您的数据库是否允许在该特定列上使用 char/varchar?你用的是什么数据库?
  • 您应该使用参数,而不是将查询和 data 组装为字符串(使用连接,或在这里使用格式)。搜索<your database product> <your programming language> parameters 应该会找到一些不错的结果。
  • 你传递给字符串什么值?

标签: c# .net sql ado.net


【解决方案1】:

这里有一些需要考虑的事情:

using (SqlConnection c = new SqlConnection(connString))
{
    c.Open();

    using (SqlCommand cmd = new SqlCommand("INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime]) VALUES(@Item,@Des1,'0',@ProdLine,@ANR,@STime)", c))
    {
        cmd.Parameters.AddWithValue("@Item", txtText1.Text);
        cmd.Parameters.AddWithValue("@Des1", txtText2.Text);
        cmd.Parameters.AddWithValue("@ProdLine", txText3.Text);
        cmd.Parameters.AddWithValue("@ANR", txtText4.Text);
        cmd.Parameters.AddWithValue("@STime", txtText5.Text);

        cmd.ExecuteNonQuery();
    }
}

如果您要将正在构建的 SQL 语句发送到服务器,它可能看起来像这样:

INSERT INTO [Table] ([Item], [Des1],[Des2], [Prodline], [ANR], [STime])
VALUES(Item Name,Here is my description.,'0',Prod line,ANR value,some time)

显然这会失败。它甚至没有用单引号包围这些值。现在,他们可能都不是性格,我明白了,但你明白我的意思。

但是雪上加霜的是,它对SQL Injection 敞开大门,就像你写的那样。使用参数化方法则不然。

【讨论】:

    【解决方案2】:

    这是非常危险的代码行。

    首先,您正在为值创建一个没有任何分隔符的字符串,这意味着唯一可以通过我们的问题传递的值是整数。其他任何内容都需要进行分隔,您不会在此 String.Format 语句中执行此操作。

    更糟糕的是,您正试图从用户直接输入创建一个 sql 语句。任何奇怪的值都可能导致您的代码失败,或者更糟糕的是,导致执行不需要的代码。想象一下用户输入例如'sdf','sdfs',sdf' 作为第一个值会发生什么。对于来自第一个文本框的前三列,生成的字符串将具有 3 个正确值。

    现在想象一下如果用户输入类似'blablabla';DROP TABLE sometable;-- 的内容会发生什么。这将导致Delete 命令执行。这是标准的 SQL 注入攻击场景。

    还有很多问题,例如,当您尝试使用浮点数、日期或任何转换为​​字符串的类型取决于您的语言环境时传递数字。

    您应该使用参数化查询,而不是尝试通过字符串连接来构造 SQL 查询,如Give me parameterized SQL or give me death 中所述。生成的代码更容易编写,执行速度更快,没有转换错误并且不受 SQL 注入攻击,

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多