Bij een SQL injectie kan iemand door speciale karakters in zijn email te zetten bijv. "' OR 'true'; DROP users; --"dummy@email.com, het email filter negeert wat tussen de "" staat en vindt wat erachter staat een een valide email, echter je $sql wordt nu helemaal:
SELECT * FROM users WHERE email = '"' OR 'true'; DROP users; --"dummy@email.com'
de --"dummy@email.com' wordt door de SQL server als commentaar gezien, ook wordt de WHERE email = '"' OR TRUE wordt gezien alsof er geen WHERE clause is en er worden nu 2 SQL commando's uitgevoerd namelijk
SELECT * FROM users;
DROP users;
waardoor er 1. veel meer records terug komen dan datgene waar je de WHERE voor had gezet, en 2. door de tweede SQL wordt de tabel ook gewist.
Dit wil je voorkomen dan gebruik je mysqli_real_escape_string om ALLE velden die je aan een SQL wilt vastplakken te filteren.
In de code hieronder https://github.com/NickKoole/educom-webshop-database-1697464368/blob/f2cd9371855110f7e30b92654e26abec38c7fddc/file_repository.php#L27-L31 https://github.com/NickKoole/educom-webshop-database-1697464368/blob/f2cd9371855110f7e30b92654e26abec38c7fddc/file_repository.php#L51-L56 Wordt steeds data uit bijv. een POST verzoek aan een SQL query vastgeplakt, dit kan mogelijk een SQL injectie veroorzaken.
Bij een SQL injectie kan iemand door speciale karakters in zijn email te zetten bijv.
"' OR 'true'; DROP users; --"dummy@email.com
, het email filter negeert wat tussen de""
staat en vindt wat erachter staat een een valide email, echter je $sql wordt nu helemaal:de
--"dummy@email.com'
wordt door de SQL server als commentaar gezien, ook wordt deWHERE email = '"' OR TRUE
wordt gezien alsof er geen WHERE clause is en er worden nu 2 SQL commando's uitgevoerd namelijkwaardoor er 1. veel meer records terug komen dan datgene waar je de
WHERE
voor had gezet, en 2. door de tweede SQL wordt de tabel ook gewist.Dit wil je voorkomen dan gebruik je
mysqli_real_escape_string
om ALLE velden die je aan een SQL wilt vastplakken te filteren.Nu worden alle illegale characters ge-escaped met (in het geval van mysql een
\
) en wordt de $sqlen dat wordt als 1 SQL commando gezien