NickKoole / educom-webshop-database-1697464368

0 stars 0 forks source link

Deze code is vatbaar voor `SQL-injectie` #13

Open JeroenHeemskerk opened 1 year ago

JeroenHeemskerk commented 1 year ago

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:

   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.

    $email = mysqli_real_escape_string($conn, $email);

Nu worden alle illegale characters ge-escaped met (in het geval van mysql een \) en wordt de $sql

   SELECT * FROM users WHERE email = '\"\' OR \'true\'; DROP users; \-\-\"dummy@email.com'

en dat wordt als 1 SQL commando gezien