betrifft: C# csharp MS SQL
SQL Profiler in SQL Server Management Studio lässt alle Abfragen beobachten, die im Hintergrund der Applikation laufen. Das bringt Vorteile für Entwickler beim Debugging eigener Software und hilft Prozesse der fremden Software zu verstehen. Der Nachteil ist, dass solche Befehle von der Injektion nicht geschützt sind. Abhilfe schafft vorbereiteten Befehl. Die unterschied besteht darin, dass die Parameter nicht sofort übergeben werden, sondern werden vom System zuerst geprüft.
Hier ist Codebeispiel auf c#
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
} |
Wenn man Ablauf im SQL Manager beobachtet, dann sieht man
SQL Befehl
INSERT INTO myTable (ID, myFied) VALUES (@ID, @myField)
|
nicht.
Stattdessen wird angezeigt
EXECsp_execute10, 5,‚Test‘ |
In den Moment ist der Befehl schon vorbereitet. Den kann
man sehen, wenn man (unter Sql Server 2008 und höher) folgende Abfrage ausführt
selecttext
fromsys.dm_exec_requests
crossapplysys.dm_exec_sql_text(plan_handle)
where session_id = 10 |
Wobei 10 ist SPID von Profiler, 5 und „Test“ unsere Parameterwerte.
Wie kann man den Befehl anzeigen lassen?
Dafür muss man im Profiler unter Event StoredProcedure;CacheHit, sowie SQL:StmtCompleted
und RPC:Completed häkchen setzen.
Und nun sollte unser
vorgebereiteter Befehl sichtbar sein.