このクエリは、SQLインジェクション攻撃にさらされます。プリペアドステートメントに変換する必要がありますが、実際のエラーはテーブル名Usersの使用によるものです。SELECT ... Userがあります。Usersである必要があります。間違った列名エラーが発生しない理由は、Userが予約済みのキーワードであるため、テーブル名を[]で区切っていない限り、SQLServerはその特定のエラーを表示します。 。次のコードで修正できます。
string _query = "SELECT PC.SN, Users.Name + ' ' + Users.Family as AssignedTo FROM PC LEFT JOIN Users ON PC.USERID = Users.ID WHERE PC.Type = @Type";
SqlConnection conn = new SqlConnection("YOUR_CONNECTION_STRING");
SqlCommand cmd = new SqlCommand(_query, connection);
cmd.Parameters.AddWithValue("Type", AssetTypeCB.SelectedItem.Value);
DataTable dt = new DataTable();
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
テーブル名が実際にUserの場合、このコードはエラーを修正します
string _query = "SELECT PC.SN, [User].Name + ' ' + [User].Family as AssignedTo FROM PC LEFT JOIN [User] ON PC.USERID = [User].ID WHERE PC.Type = @Type";
SqlConnection conn = new SqlConnection("YOUR_CONNECTION_STRING");
SqlCommand cmd = new SqlCommand(_query, connection);
cmd.Parameters.AddWithValue("Type", AssetTypeCB.SelectedItem.ToString());
DataTable dt = new DataTable();
SqlDataAdapter adp = new SqlDataAdapter(cmd);
adp.Fill(dt);
SQLインジェクション攻撃の詳細
smooeneが元のステートメントに次の値を入力したとします。
'; DELETE FROM Users; --
SQLステートメントを実行すると、SQLServerはそれを次のように解釈します。
SELECT PC.SN, User.Name + ' ' + User.Family as AssignedTo
FROM PC LEFT JOIN Users ON PC.USERID = Users.ID
WHERE PC.Type = ''; DELETE FROM Users; --'
このステートメントは完全に有効であり、ユーザーが持っている権限のレベルが与えられると、Usersテーブルからすべてのレコードが削除される可能性があります。プリペアドステートメントを使用すると、それが起こらないようにするのに役立ちます。