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.
Founder of Octal Solutions a .NET software house.
Passionate dev, blogger, occasionally speaker, one of the leaders of Wroc.NET user group. Microsoft MVP. Podcaster – Ostrapila.pl