Version 2
16.09.2009 10:42:32
Dies ist die aktuelle Version
Zuerst möchte ich sagen, das sich das binden in einer Zeile erledigen läßt.
using (SqlConnection connection = new SqlConnection(connectionString)){
DataSet userDataset = new DataSet();
SqlDataAdapter myDataAdapter = new SqlDataAdapter(
"SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id",
connection);
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11).Value = SSN.Text;
myDataAdapter.Fill(userDataset);
}Das resultierende SQL-Statement aus dem oberen Anweisung wenn ich annehme, das SSN.Text den Wert "Test'SQL" im ersten Beispiel, und den Wert "Test''SQL" im zweiten Beispiel hat:
//@au_id = Test'SQL
exec sp_executesql N'SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id',
N'@au_id varchar(100)', @au_id = 'Test''SQL'
//@au_id = Test''SQL
exec sp_executesql N'SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id',
N'@au_id varchar(100)', @au_id = 'Test''''SQL'
Wie man sieht, kümmert sich das ADO.Net um das escapen und nicht der SQL-Server. Von daher bist du von der Implementeriung des ADO.Net abhängig. Wenn die einen Fehler hat, wird es möglich trotz binden eine SQL-Incetion auszuführen. Mir sind jedoch keine Fehler bekannt und rückblickend betrachtet hatte das .net Framework auch nicht viel Sicherheitsprobleme.
Bin ist von daher als sicherste Methode anzusehen, SQL-Injection zu verhinden.