Deze wikiHow leert je hoe je SQL-injecties kunt voorkomen met behulp van Prepared Statements in PHP. SQL-injectie is tegenwoordig een van de meest voorkomende zwakke plekken in webapplicaties. Prepared Statements gebruiken gebonden parameters en combineren variabelen niet met SQL-strings, waardoor een aanvaller de SQL-instructie niet kan wijzigen.
Prepared Statements combineren de variabele met de gecompileerde SQL-instructie, zodat de SQL en de variabelen afzonderlijk worden verzonden. De variabelen worden vervolgens geïnterpreteerd als louter strings en maken geen deel uit van de SQL-instructie. Met de methoden in de onderstaande stappen hoeft u geen andere SQL-injectiefiltertechnieken te gebruiken, zoals de mysql_real_escape_string ().[1]
Deel een van de twee:
SQL-injectie begrijpen
- 1 SQL-injectie is een vorm van kwetsbaarheid in toepassingen die gebruikmaken van een SQL-database. Het beveiligingslek ontstaat wanneer een gebruikersinvoer wordt gebruikt in een SQL-instructie:
name $ = $ _GET['Gebruikersnaam']; $ vraag = "SELECT-wachtwoord FROM tbl_user WHERE name = 'name $' ";
- 2 De waarde die een gebruiker invoert in de URL-variabele gebruikersnaam wordt toegewezen aan de variabele name $. Het wordt dan rechtstreeks in de SQL-instructie geplaatst, waardoor de gebruiker de SQL-instructie kan bewerken.
name $ = "admin" OF 1 = 1 - "; $ vraag = "SELECT-wachtwoord FROM tbl_user WHERE name = 'name $' ";
- 3 De SQL-database ontvangt dan de SQL-instructie als volgt:
SELECT wachtwoord VAN tbl_users WAAR naam = 'beheerder' OF 1=1 -- '
- Dit is geldige SQL, maar in plaats van één wachtwoord voor de gebruiker te retourneren, retourneert de instructie alle wachtwoorden in de tabel tbl_user. Dit is niet iets dat u wilt in uw webapplicaties.
- Dit is geldige SQL, maar in plaats van één wachtwoord voor de gebruiker te retourneren, retourneert de instructie alle wachtwoorden in de tabel tbl_user. Dit is niet iets dat u wilt in uw webapplicaties.
Deel twee van twee:
MySQLi gebruiken om voorbereide verklaringen te maken
-
1 Maak de SELECT-query voor mySQLi.
Gebruik de onderstaande code om gegevens uit een tabel te selecteren met behulp van MySQLi Prepared Statements.
name $ = $ _GET['Gebruikersnaam']; als ($ stmt = $ mysqli->bereiden("SELECT-wachtwoord FROM tbl_users WHERE name =?")) // Bind een variabele aan de parameter als een tekenreeks. $ stmt->bind_param("S", name $); // Voer de verklaring uit. $ stmt->uitvoeren(); // Haal de variabelen uit de query. $ stmt->bind_result($ pas); // Haal de gegevens op. $ stmt->halen(); // Geef de gegevens weer. printf("Wachtwoord voor gebruiker % s is % s\ n", name $, $ pas); // Sluit de voorbereide verklaring. $ stmt->dichtbij();
- Opmerking: de variabele $ mysqli is het mySQLi-verbindingsobject.
-
2 Maak de mySQLi INSERT-query. Gebruik de onderstaande code om gegevens IN TE VOEREN in een tabel met behulp van MySQLi Prepared Statements.
name $ = $ _GET['Gebruikersnaam']; $ password = $ _GET['wachtwoord']; als ($ stmt = $ mysqli->bereiden("INSERT INTO tbl_users (name, password) VALUES (?,?)")) // Bind de variabelen als strings aan de parameter. $ stmt->bind_param("Ss", name $, $ password); // Voer de verklaring uit. $ stmt->uitvoeren(); // Sluit de voorbereide verklaring. $ stmt->dichtbij();
- Opmerking: de variabele $ mysqli is het mySQLi-verbindingsobject.
-
3 Maak de UPDATE-query mySQLi. Gebruik de onderstaande code om gegevens in een tabel UPDATE te bewerken met behulp van mySQLi Prepared Statements.
name $ = $ _GET['Gebruikersnaam']; $ password = $ _GET['wachtwoord']; als ($ stmt = $ mysqli->bereiden("UPDATE tbl_users SET-wachtwoord =? WHERE name =?")) // Bind de variabelen als strings aan de parameter. $ stmt->bind_param("Ss", $ password, name $); // Voer de verklaring uit. $ stmt->uitvoeren(); // Sluit de voorbereide verklaring. $ stmt->dichtbij();
- Opmerking: de variabele $ mysqli is het mySQLi-verbindingsobject.
-
4 Maak de mySQLi DELETE-query. Het onderstaande script is hoe u gegevens uit een tabel kunt verwijderen met behulp van MySQLi Prepared Statements.
name $ = $ _GET['Gebruikersnaam']; $ password = $ _GET['wachtwoord']; als ($ stmt = $ mysqli->bereiden("DELETE FROM tbl_users WHERE name =?")) // Bind de variabele aan de parameter als een tekenreeks. $ stmt->bind_param("S", name $); // Voer de verklaring uit. $ stmt->uitvoeren(); // Sluit de voorbereide verklaring. $ stmt->dichtbij();
- Opmerking: de variabele $ mysqli is het mySQLi-verbindingsobject.