【问题标题】:Can an string variable contain an int字符串变量是否可以包含 int
【发布时间】:2019-02-28 22:22:12
【问题描述】:

我有一个字符串变量string SQLstr = "SELECT [column] FROM [DB].[Table] WHERE [column]= {0}"。这在查询VARCHAR 列时工作得非常好,但是如果我查询了一个 int 列,那么我会得到一个错误,大概是因为它正在查询一个带有字符串的 int 列。

由于textBox1.Text 是用户输入,有什么方法可以在运行SqlDataAdapter cmd = new SqlDataAdapter(string.Format(SQLstrL,textBox1.Text), conn) 时将其解释为int?

【问题讨论】:

  • 这没有意义...请提供一个完整的不工作场景示例,并包含错误消息。
  • 是的。它是使用参数调用的。您在这里拥有的模式绝对不是您应该如何编写另一个查询的方式。这对 sql 注入很开放。如果您使用参数,您可以防止注入并完全控制数据类型。在bobby tables 来访之前修复此问题。
  • 您的代码存在SQL注入,您应该认真考虑在查询中采用参数

标签: c# sql-server winforms


【解决方案1】:

不要这样做

你所拥有的是很容易受到 SQL 注入攻击的;它实际上是在乞求被黑。

有一种更好的方法可以完成同样的事情,既可以安全地免受这些攻击,也可以解决您的字符串与 int 问题:

string SQLstr = "SELECT [column] FROM [DB].[Table] WHERE [column]= @Parameter";
var cmd = new SqlCommand(SQLstr, conn);
cmd.Parameter.Add("@Parameter", SqlDbType.Int).Value = int.Parse(textBox1.Text);

string SQLstr = "SELECT [column] FROM [DB].[Table] WHERE [column]= @Parameter";
var cmd = new SqlCommand(SQLstr, conn);
cmd.Parameter.Add("@Parameter", SqlDbType.VarChar, 20).Value = textBox1.Text;

请注意,您仍然必须知道查询中该位置的期望值是什么。 没有什么可以帮助您摆脱这种情况,因为我们生活在一个强类型的世界中。甚至可以推断您的数据类型的AddWithValue() 方法也有significant reasons not to use it

【讨论】:

    【解决方案2】:

    您可以尝试在 sql 结果的末尾连接一个空字符串。如果结果是(装箱的)int,则 + "" 将强制将其转换为字符串。

    我同意 cmets 关于 SQL 注入风险的观点。这不是您可以向公众发布的东西,除非文本框非常受限。

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 2016-10-03
      • 2013-05-17
      • 1970-01-01
      • 2018-06-14
      • 2011-05-14
      • 1970-01-01
      • 2012-08-29
      相关资源
      最近更新 更多