【问题标题】:Executing Query contain string without using quotes执行查询包含字符串而不使用引号
【发布时间】:2013-11-21 11:32:23
【问题描述】:

所以我试图基于两件事删除数据库中的数据。

第一个是选择列名的组合框,第二个是要删除的行的值。

(@"SELECT * FROM Contacts WHERE " + var + " LIKE " + textBox1.Text + ";");

现在的问题是,只要文本框中的值是数字,这个查询就可以正常工作。但是,如果它是一个字符串值,则查询将失败,因为我没有插入单引号。

有没有我可以做一个单一的统一查询来处理数字和文本数据。

【问题讨论】:

  • 答案取决于您选择的数据库访问工具。不过,您可能想了解en.wikipedia.org/wiki/SQL_injection
  • 不要关心 SQL 注入。
  • 你.... 不在乎 SQL 注入?!好的,所以我选择 var foo 并输入 textbox1 'foo';DELETE * FROM Contacts。现在我猜你在乎!
  • 不,我只会显示异常。这只是一个愚蠢的任务。
  • Assignment 或 Missle 控制系统 - 你仍然应该关心 SQL 注入漏洞!

标签: c# .net sql sql-server tsql


【解决方案1】:

好吧,我们不要这样做。我们只需要使用参数。

(@"SELECT * FROM Contacts WHERE " + var + " LIKE @" + var + ";");

...

cmd.Parameters.AddWithValue("@" + var, textBox1.Text);

所以整体代码可能如下所示:

string varName = string.Format("@{0}", var);
string sql = string.Format("SELECT * FROM Contacts WHERE {0} LIKE @{0}", var);

using (SqlConnection c = new SqlConnection(cString))
using (SqlCommand cmd = new SqlCommand(sql, c))
{
    cmd.Parameters.AddWithValue(varName, textBox1.Text);

    DataTable dt = new DataTable();
    dt.Load(cmd.ExecuteReader());
}

另外,看看this post on my blog。它讲述了我刚刚经历的事情,以及如何安全地执行LIKE

【讨论】:

    【解决方案2】:

    尝试使用parameterized query

    SqlCommand command = new SqlCommand(
        @"SELECT * FROM Contacts WHERE " + var + " LIKE @param", connection));
    
    command.Parameters.AddWithValue("@param", textBox1.Tex);
    

    【讨论】:

      【解决方案3】:

      您需要在值周围添加引号,以便它接受字符串以及数值

      (@"SELECT * FROM Contacts WHERE " + var + " LIKE '" + textBox1.Text + "';");
      

      【讨论】:

        【解决方案4】:

        这个怎么样:

         (@"SELECT * FROM Contacts WHERE " + var + " LIKE " _
         + iif(isnumeric(textBox1.Text),textbox1.text, "'" +textbox1.text +"'" + ";");
        

        这是一个以 vb 为中心的 IIF 语句,但在 C# 中有一个等价的语句。

        【讨论】:

          【解决方案5】:
          (@"SELECT * FROM Contacts WHERE " + var + " LIKE '" + textBox1.Text + "';");
          

          【讨论】:

            【解决方案6】:

            U可以检查值是整数还是字符串,并相应地格式化不同的查询。U也可以使用like运算符。

            【讨论】:

              【解决方案7】:
              String str = Console.ReadLine();
              int myval;
              String query="";
              if(int.TryParse(str,out  myval))
                 query=@"SELECT * FROM Contacts WHERE " + var + " LIKE " + myval + ";";
              else
                 query=@"SELECT * FROM Contacts WHERE " + var + " LIKE '" + str + "';";
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2014-05-29
                • 2011-05-14
                • 1970-01-01
                • 2023-04-10
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多