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 インジェクションのリスクにさらしています。パラメータを使用しました。

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 に答える