Hierdie wikiHow leer u hoe u SQL -inspuiting kan voorkom met behulp van voorbereide stellings in PHP. SQL -inspuiting is vandag een van die algemeenste kwesbaarhede in webtoepassings. Voorbereide stellings gebruik gebonde parameters en kombineer nie veranderlikes met SQL -snare nie, wat dit vir 'n aanvaller onmoontlik maak om die SQL -stelling te verander.
Voorbereide stellings kombineer die veranderlike met die saamgestelde SQL -stelling, sodat die SQL en die veranderlikes afsonderlik gestuur word. Die veranderlikes word dan geïnterpreteer as blote snare en nie deel van die SQL -stelling nie. As u die metodes in die onderstaande stappe gebruik, hoef u geen ander tegnieke vir die inspuiting van SQL -inspuiting te gebruik nie, soos die mysql_real_escape_string ().
Stappe
Deel 1 van 2: Begrip van SQL -inspuiting
Stap 1. SQL -inspuiting is 'n tipe kwesbaarheid in toepassings wat 'n SQL -databasis gebruik
Die kwesbaarheid ontstaan wanneer 'n gebruikersinvoer in 'n SQL -verklaring gebruik word:
$ naam = $ _GET ['gebruikersnaam']; $ query = "KIES wagwoord VANAF tbl_user WAAR naam = '$ naam'";
Stap 2. Die waarde wat 'n gebruiker in die URL -veranderlike gebruikersnaam invoer, sal aan die veranderlike $ naam toegeken word
Dit word dan direk in die SQL -stelling geplaas, sodat die gebruiker die SQL -stelling kan wysig.
$ naam = "admin" OF 1 = 1 - "; $ query = "KIES wagwoord VANAF tbl_user WAAR naam = '$ naam'";
Stap 3. Die SQL -databasis ontvang dan die SQL -stelling soos volg:
KIES wagwoord VANAF tbl_users WAAR naam = 'admin' OF 1 = 1 - '
-
Dit is geldige SQL, maar in plaas daarvan om een wagwoord vir die gebruiker terug te gee, sal die verklaring al die wagwoorde in die tabel tbl_user teruggee. Dit is nie iets wat u in u webtoepassings wil hê nie.
Deel 2 van 2: Gebruik mySQLi om voorbereide state te skep
Stap 1. Skep die mySQLi SELECT -navraag
Gebruik die onderstaande kode om data uit 'n tabel te KIES met behulp van mySQLi Prepared Statements.
$ naam = $ _GET ['gebruikersnaam']; if ($ stmt = $ mysqli-> prepar ("SELECT password FROM tbl_users WHERE name =?")) {// Bind 'n veranderlike aan die parameter as 'n string. $ stmt-> bind_param ("s", $ naam); // Voer die stelling uit. $ stmt-> uitvoer (); // Kry die veranderlikes uit die navraag. $ stmt-> bind_result ($ pas); // Haal die data. $ stmt-> haal (); // Gee die data. printf ("Wagwoord vir gebruiker %s is %s / n", $ naam, $ pas); // Sluit die voorbereide verklaring. $ stmt-> sluit (); }
Nota: die veranderlike $ mysqli is die mySQLi -verbindingsobjek
Stap 2. Skep die mySQLi INSERT -navraag
Gebruik die onderstaande kode om data in 'n tabel in te voer met behulp van mySQLi Prepared Statements.
$ naam = $ _GET ['gebruikersnaam']; $ wagwoord = $ _GET ['wagwoord']; if ($ stmt = $ mysqli-> prepar ("INVOER IN Tbl_gebruikers (naam, wagwoord) WAARDES (?,?)"))) {// Bind die veranderlikes aan die parameter as snare. $ stmt-> bind_param ("ss", $ naam, $ wagwoord); // Voer die stelling uit. $ stmt-> uitvoer (); // Sluit die voorbereide verklaring. $ stmt-> sluit (); }
Nota: die veranderlike $ mysqli is die mySQLi -verbindingsobjek
Stap 3. Skep die mySQLi UPDATE -navraag
Gebruik die onderstaande kode om data in 'n tabel op te dateer met behulp van mySQLi Prepared Statements.
$ naam = $ _GET ['gebruikersnaam']; $ wagwoord = $ _GET ['wagwoord']; if ($ stmt = $ mysqli-> prepar ("UPDATE tbl_users SET password =? WHERE name =?")) {// Bind die veranderlikes aan die parameter as snare. $ stmt-> bind_param ("ss", $ wagwoord, $ naam); // Voer die stelling uit. $ stmt-> uitvoer (); // Sluit die voorbereide verklaring. $ stmt-> sluit (); }
Nota: die veranderlike $ mysqli is die mySQLi -verbindingsobjek
Stap 4. Skep die mySQLi DELETE -navraag
Die onderstaande script is hoe om data uit 'n tabel te verwyder met behulp van mySQLi Prepared Statements.
$ naam = $ _GET ['gebruikersnaam']; $ wagwoord = $ _GET ['wagwoord']; if ($ stmt = $ mysqli-> prepar ("DELETE FROM tbl_users WHERE name =?")) {// Bind die veranderlike aan die parameter as 'n string. $ stmt-> bind_param ("s", $ naam); // Voer die stelling uit. $ stmt-> uitvoer (); // Sluit die voorbereide verklaring. $ stmt-> sluit (); }