C#SQL注入(理解困难)

时间:2017-10-16 11:26:45

标签: c# sql security sql-injection

我知道C#中有SQL注入的其他答案,但我是编程新手,所以我很难理解如何使用我自己的代码进行设置。这就是我打开另一个问题的原因。

这是我现在的代码,但我希望从SQL注入中获得安全。

    private void btnAdd_Click(object sender, EventArgs e)
    {
        string constring = $"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=" + Directory.GetCurrentDirectory().ToString() + "\\BarcodeDB.mdf;Integrated Security=True";
        string Query = "INSERT INTO Products (Barcodes, Name, EDate, Quantity, Price) VALUES ('" + this.tbxBar.Text + "','" + this.tbxName.Text + "','" + this.dateDate.Value.Date + "','" + this.tbxQua.Text + "','" + this.tbxPrice.Text + "') ;";
        SqlConnection conDataBase = new SqlConnection(constring);
        SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase);
        SqlDataReader myReader;
        try
        {
            conDataBase.Open();
            myReader = cmdDataBase.ExecuteReader();
            while (myReader.Read())
            {

            }

            Fillcombo();

        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        conDataBase.Close();
    }

如果有人可以解释或编写代码,那么我可以尝试自己理解。我似乎并不知道我应该改变什么。

事先谢谢!

编辑:

现在将代码更改为此,但它不会将其保存到数据库中

   private void btnAdd_Click(object sender, EventArgs e)
    {
        string constring = $"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=" +
                           Directory.GetCurrentDirectory().ToString() + "\\BarcodeDB.mdf;Integrated Security=True";
        string query =
           "INSERT INTO Products (Barcodes, Name, EDate, Quantity, Price) VALUES (@barcodeValue, @nameValue, @dateValue, @quantityValue, @priceValue) ;";
        SqlConnection conDataBase = new SqlConnection(constring);
        SqlCommand cmdDataBase = new SqlCommand(query, conDataBase);

        // Add the parameters to the command, setting the values as needed. Guessing at value types here.
        // Note that with strings you will need to define the length of the column in the DB in the assignment
        cmdDataBase.Parameters.Add("barcodeValue", SqlDbType.NVarChar, 255).Value = this.tbxBar.Text;
        cmdDataBase.Parameters.Add("nameValue", SqlDbType.NVarChar, 255).Value = this.tbxName.Text;
        cmdDataBase.Parameters.Add("dateValue", SqlDbType.Date).Value = this.dateDate.Text;
        cmdDataBase.Parameters.Add("quantityValue", SqlDbType.Int).Value = this.tbxQua.Text;
        cmdDataBase.Parameters.Add("priceValue", SqlDbType.Decimal).Value = this.tbxPrice.Text;

        SqlDataReader myReader;
        try
        {
            conDataBase.Open();
            myReader = cmdDataBase.ExecuteReader();
            while (myReader.Read())
            {
            }

            Fillcombo();
        }

2 个答案:

答案 0 :(得分:1)

    string Query = "INSERT INTO Products (Barcodes, Name, EDate, Quantity, Price) VALUES ('" + this.tbxBar.Text + "','" + this.tbxName.Text + "','" + this.dateDate.Value.Date + "','" + this.tbxQua.Text + "','" + this.tbxPrice.Text + "') ;";

这条线是危险线;假设您的文本框正在接受用户输入,我可以轻松输入一些代码,这些代码将针对您的数据库执行,可能会擦除它,将内容转储到屏幕上,或任何其他恶作剧或损坏情况。

防范它的方法是使用参数。他们将确保您传入的内容是正确的值,并在您到达数据库之前抛出异常。在恶意用户有机会针对您的数据库执行错误代码之前抛出异常会更好。

下面的内容应该可以使用,但您可能需要更改类型以适应您的数据库方案。请注意您的查询如何使用" @ variableName"现在模式,以及稍后如何使用这些变量名称向SqlCommand添加参数。

private void btnAdd_Click(object sender, EventArgs e)
{
   string constring = $"Data Source=(LocalDB)\\MSSQLLocalDB;AttachDbFilename=" +
                      Directory.GetCurrentDirectory().ToString() + "\\BarcodeDB.mdf;Integrated Security=True";
   string query =
      "INSERT INTO Products (Barcodes, Name, EDate, Quantity, Price) VALUES (@barcodeValue, @nameValue, @dateValue, @quantityValue, @priceValue) ;";
   SqlConnection conDataBase = new SqlConnection(constring);
   SqlCommand cmdDataBase = new SqlCommand(query, conDataBase);

   // Add the parameters to the command, setting the values as needed. Guessing at value types here.
   // Note that with strings you will need to define the length of the column in the DB in the assignment
   cmdDataBase.Parameters.Add("barcodeValue", SqlDbType.NVarChar, 255).Value = this.tbxBar.Text;
   cmdDataBase.Parameters.Add("nameValue", SqlDbType.NVarChar, 255).Value = this.tbxName.Text;
   cmdDataBase.Parameters.Add("dateValue", SqlDbType.Date).Value = this.dateDate.Text;
   cmdDataBase.Parameters.Add("quantityValue", SqlDbType.Int).Value = this.tbxQua.Text;
   cmdDataBase.Parameters.Add("priceValue", SqlDbType.Decimal).Value = this.tbxPrice.Text;

   SqlDataReader myReader;
   try
   {
      conDataBase.Open();
      myReader = cmdDataBase.ExecuteReader();
      while (myReader.Read())
      {
      }

      Fillcombo();
   }

   catch (Exception ex)
   {
      MessageBox.Show(ex.Message);
   }

   conDataBase.Close();
}

答案 1 :(得分:0)

创建查询字符串时使用此代码:

        string Query = "INSERT INTO Products (Barcodes, Name, EDate, Quantity, Price) VALUES (@bar, @name, @date, @qua, @price) ;";

这是为了创建和设置SqlCommand以使用该查询:

        SqlCommand cmdDataBase = new SqlCommand(Query, conDataBase);

        cmd.Parameters.AddWithValue("@bar", this.tbxBar.Text);
        cmd.Parameters.AddWithValue("@name", this.tbxName.Text);
        cmd.Parameters.AddWithValue("@date", this.dateDate.Value.Date);
        cmd.Parameters.AddWithValue("@qua", this.tbxQua.Text);
        cmd.Parameters.AddWithValue("@price", this.tbxPrice.Text);

然后您可以以相同的方式使用其余代码。