SQL Injection - wstrzyknięcie "kodu" SQL bezpośrednio do wykonania. To znaczy, że nie zabezpieczamy się właściwie i dajemy możliwość przesłania jakiegoś parametru bezpośrednio od użytkownika.
W podanym tutaj w artykule przykładzie ktoś wpisał w pole hasła OR 1 = 1
tym samym po stronie serwera wykonało się polecenie:
SELECT Id FROM Users WHERE Login = 'mój login' AND Password = '' OR '1'='1'
Nie otrzymujemy więc hasła użytkownika tylko omijamy w ogóle warunek sprawdzania hasła. Artykuł IMHO ma błąd bo podaje że OR ma pierwszeństwo przed AND w SQL a w znanych mi silnikach jest odwrotnie:
https://learn.microsoft.com/en-us/sql/t-sql/language-elements/operator-precedence-transact-sql?view=sql-server-ver16
https://dev.mysql.com/doc/refman/8.0/en/operator-precedence.html
https://www.postgresql.org/docs/7.2/sql-precedence.html
Przebudujmy sobie to zapytanie dodając nawiasy tak by odtworzyć intencję autora
SELECT Id FROM Users WHERE Login = 'mój login' AND (Password = '' OR '1'='1')
Teraz zapytanie zwróci nam ID użytkownika który ma login mój login
ale ze względu na dodanie logicznego OR nawet przy pustym haśle warunek ten zwróci true.
Normalnie takie ID powinno być zwrócone tylko w momencie gdy para login i hasło pasują do siebie.
Myślę, że autor chciał jak najprościej opisać zagadnienie i stąd pewne uproszczenia. Ogólnie chodzi o to by zapobiec możliwości by użytkownik był w stanie dodać cokolwiek do wykonywanych zapytań tak by dokonać ich modyfikacji.
W przypadku prawidłowo parametryzowanego zapytania co najwyżej można by uzyskać
SELECT Id FROM Users WHERE Login = 'mój login' AND Password = ' OR \'1\'=\'1\'')
A to raczej wątpliwe żeby ktoś miał hasło ' OR '1'='1
i jest to już jednoznaczne z próbą odgadnięcia hasła a nie jego pominięciem.
@jurek1980: a jakim sposobem przy wstrzykiwaniu sql injection w zapytaniu na końcu dodawany jest apostrof ? np.
SELECT Id FROM Users WHERE Login = 'mój login' AND Password = ''; DROP TABLE Users --'
jeśli w input z hasłem wpiszemy
'; DROP TABLE USERS --
I mam jeszcze pytanie co do tego zdania:
"Nie otrzymujemy więc hasła użytkownika tylko omijamy w ogóle warunek sprawdzania hasła."
Czyli jak rozumiem użytkownik zostaje wtedy zalogowany ?