1

更新:谢谢大家,代码不是问题,虽然有关 SQL 注入的信息很有用,但我的问题是我使用的是旧版本的数据库,它没有相应的产品 ID,所以它使用的是第一个产品它可以找到。现在感觉很愚蠢,但感谢您的建议。

我目前有以下代码:

SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0 AttachDbFilename=C:\Users\h8005267\Desktop\Practical Project\Build\System4\System\StockControl.mdf;Integrated Security=True;Connect Timeout=30");
connection.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM Product WHERE ProductID='" + textBox3.Text + "'", connection); 
SqlDataReader re = cmd.ExecuteReader();

if (re.Read())
{
  textBox4.Text = re["ProductTitle"].ToString(); // only fills using first product in table
  textBox5.Text = re["ProductPublisherArtist"].ToString();
  comboBox1.Text = re["ProductType"].ToString();
  textBox6.Text = re["Price"].ToString();
}
else
{
  MessageBox.Show("Please enter a valid item barcode");
}
re.Close();
connection.Close();

我目前遇到的问题是虽然文本框显示按钮单击的信息,但显示的信息只是数据库中的第一行数据,而不是sql语句中textbox3对应的行

4

3 回答 3

4

试试这个。避免按照您的方式动态构建 SQL 语句。您正在向 SQL 注入的风险打开数据库。使用参数 insead。

using (var connection = new SqlConnection("connection string"))
{
    connection.Open();
    using (var cmd = new SqlCommand("SELECT * FROM Product WHERE ProductID=@MYVALUE", connection))
    {
        cmd.Parameters.Add("@MYVALUE", SqlDbType.VarChar).Value = textBox3.Text;
        SqlDataReader re = cmd.ExecuteReader();

        if (re.Read())
        {
            textBox4.Text = re["ProductTitle"].ToString(); // only fills using first product in table
            textBox5.Text = re["ProductPublisherArtist"].ToString();
            comboBox1.Text = re["ProductType"].ToString();
            textBox6.Text = re["Price"].ToString();
        }
        else
        {
            MessageBox.Show("Please enter a valid item barcode");
        }
    }
}
于 2013-04-12T11:50:32.290 回答
2

在该行放一个断点

SqlDataReader re = cmd.ExecuteReader();

并在 textBox3 中输入以下内容

'; DROP TABLE Product; SELECT '

' 将被输入到您的文本框中。现在执行您的方法并仔细阅读生成的 sql 命令...欢迎使用 sql 注入 ;)

@M Patel:谢谢您的评论,您是完全正确的

结果将是以下 SQL

SELECT * FROM Product WHERE ProductID=''; DROP TABLE Product; SELECT ''

这将允许恶意用户破坏您的数据库。

为了防止您应该使用像 M Patel 在他的回答中建议的准备好的陈述

于 2013-04-12T11:50:08.117 回答
2

你有 SQL 注入问题'" + textBox3.Text + "'"

而且您不必像那样命名您的控件,您必须使用有意义的名称

你可以使用这个代码

using (SqlConnection connection = new SqlConnection(@"Data Source=(LocalDB)\v11.0 AttachDbFilename=C:\Users\h8005267\Desktop\Practical Project\Build\System4\System\StockControl.mdf;Integrated Security=True;Connect Timeout=30"))
{
    connection.Open();
    SqlCommand cmd = new SqlCommand("SELECT * FROM Product WHERE ProductID=@ProductID", connection);
    cmd.Parameters.AddWithValue("@ProductID", textBox3.Text);
    SqlDataReader re = cmd.ExecuteReader();
    if (re.Read())
    {
        textBox4.Text = re.GetString(re.GetOrdinal("ProductTitle")); // only fills using first product in table
        textBox5.Text = re.GetString(re.GetOrdinal("ProductPublisherArtist"));
        comboBox1.Text = re.GetString(re.GetOrdinal("ProductType"));
        textBox6.Text = re.GetString(re.GetOrdinal("Price"));
    }
    else
    {
        MessageBox.Show("Please enter a valid item barcode");
    }
    re.Close();
}
于 2013-04-12T11:53:06.467 回答