Wyobraźmy sobie poniższy kawałek kodu…

using (var connection = new SqlConnection(@””))

{

    connection.Open();

    var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

    var isLoggedCommand = new SqlCommand(

          string.Format(“select isLogged from Users WHERE Name = ‘{0}'”, userName),

          connection);

    isLoggedCommand.ExecuteScalar();

}

Dla osób znających się w temacie już na pierwszy rzut oka widać potencjalny SQL Injection w linii z selectem. Jednak czujność naszą może uśpić fakt jak dostarczana jest wartość zmiennej userName. Do głowy mogą przychodzić myśli taki jak:

Nie dostajemy jej z zewnątrz. Mamy ją z systemu…
Użytkownik nie może nam jej zanieczyścić…
Jesteśmy bezpieczni…

Nic bardziej mylnego, bo kto przecież powiedział, że konto użytkownika musi nazywać się: tata, jurek czy komputer-kuchnia. Nasz kod będzie podatny na SQL Injection bo konto o nazwie ‘ delete Users– (zaczynające się od apostrofu a kończące na podwójnym myślniku) jest dopuszczalne a SQL server poprawie wykona oba zapytania na bazie. Z naszą tabelą Users będziemy mogli się pożegnać.

Na szczęście atakujący ma ograniczone możliwości. Nazwa użytkownika może składać się do 20 znaków oraz nie może zawierać znaków takich jak: /\[]”:;|+=?*. Jak widać jednak nawet bez tych znaków skuteczny atak jest możliwy.