Frage

.NET, Java und andere High-Level-Datenbank-APIs in verschiedenen Sprachen stellen häufig Techniken bereit, die als vorbereitete Anweisungen und Parameterbindung bekannt sind, im Gegensatz zum Senden von Klartextbefehlen an den Datenbankserver.Ich würde gerne wissen, was passiert, wenn Sie eine Anweisung wie diese ausführen:

SqlCommand cmd = new SqlCommand("GetMemberByID");
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter param = new SqlParameter("@ID", memberID);
para.DbType = DbType.Integer;
cmd.Parameters.Add(param);

Ich weiß, dass dies eine bewährte Methode ist.SQL-Injection-Angriffe werden auf diese Weise minimiert.Aber was passiert genau unter der Haube, wenn Sie diese Anweisungen ausführen?Ist das Endergebnis immer noch eine SQL-sichere Zeichenfolge?Wenn nicht, was ist das Endergebnis?Und reicht das aus, um SQL-Injection-Angriffe zu verhindern?

War es hilfreich?

Lösung

Die MySQL-Handbuchseite auf vorbereitete Anweisungen liefert viele Informationen (die für jedes andere RDBMS gelten sollten).

Grundsätzlich wird Ihre Anweisung im Voraus analysiert und verarbeitet, und die Parameter werden separat gesendet, anstatt zusammen mit dem SQL-Code verarbeitet zu werden.Dadurch werden SQL-Injection-Angriffe vermieden, da die SQL analysiert wird, bevor die Parameter überhaupt festgelegt werden.

Andere Tipps

in Laiensprache:Wenn eine vorbereitete Anweisung gesendet wird, verwendet die Datenbank einen Plan, sofern dieser verfügbar ist. Sie muss nicht jedes Mal, wenn diese Abfrage gesendet wird, einen Plan neu erstellen, sondern nur die Werte der Parameter haben sich geändert.Dies ist der Funktionsweise von Procs sehr ähnlich. Der zusätzliche Vorteil von Procs besteht darin, dass Sie Berechtigungen nur über Procs und nicht für die zugrunde liegenden Tabellen erteilen können

Wenn Sie MS SQL verwenden, laden Sie den Profiler und Sie werden sehen, welche SQL-Anweisungen generiert werden, wenn Sie parametrisierte Abfragen verwenden.Hier ist ein Beispiel (ich verwende Enterprise Libary 3.1, aber die Ergebnisse sind die gleichen, wenn ich SqlParameters direkt verwende) für SQL Server 2005:

string sql = "SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did";
Database db = DatabaseFactory.CreateDatabase();
using(DbCommand cmd = db.GetSqlStringCommand(sql))
{
  db.AddInParameter(cmd, "DomName", DbType.String, "xxxxx.net");
  db.AddInParameter(cmd, "Did", DbType.Int32, 500204);

  DataSet ds = db.ExecuteDataSet(cmd);
}

Dadurch entsteht:

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(9),
  @Did int',
  @DomName=N'xxxxx.net',
  @Did=500204

Sie können hier auch sehen, dass, wenn Anführungszeichen als Parameter übergeben wurden, diese entsprechend maskiert werden:

db.AddInParameter(cmd, "DomName", DbType.String, "'xxxxx.net");

exec sp[underscore]executesql N'SELECT * FROM tblDomains WHERE DomainName = @DomName AND DomainID = @Did',
  N'@DomName nvarchar(10),
  @Did int',
  @DomName=N'''xxxxx.net',
  @Did=500204
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top