sql >> Database >  >> RDS >> Mysql

Een injectie-aanval die slaagt met mysql_query, maar faalt met mysqli_query

Ik ben ertoe gebracht te geloven dat:

$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");

kan gemakkelijk worden aangetast met waarden voor $idValue die de ' . sluiten en voeg dan extra commando's toe, zoals

$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";

Hoewel ik me realiseer dat u aangeeft dat meerdere instructies zijn uitgeschakeld, is het niet zo afschuwelijk om ongeautoriseerde gegevens te retourneren in plaats van gegevens in de tabel rechtstreeks te bewerken, zoals:

  $idValue = "z' OR name IS NOT NULL OR name = 'x";

Terwijl er met MySQLi de mogelijkheid is dat de aanpak kan worden gebruikt met prepared statements , wat zou voorkomen dat de variabele zich buiten zijn status als slechts een variabele gedraagt. Zoals:

mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();

Mijn begrip van bind_param is dat de variabele alle MySQL-sleutelwoorden en -sleuteltekens zou laten escapen, waardoor de inbreuk op de beveiliging en de terugkeer van niet-geautoriseerde rijen zou worden voorkomen.

Dit is een keuze die MySQL niet heeft . Voorbereide verklaringen helpen bij het verbeteren injectiebeveiliging, maar ze zullen niet verhinderen injectieaanvallen alleen, maar er zouden meer moeten worden gebruikt als onderdeel van een bredere strategie door de programmeur.

Net zoals het dragen van kogelvrije vesten je niet onoverwinnelijk maakt, maar het zal je overlevingskansen aanzienlijk vergroten. MySQLi is geen wondermiddel, en PDO ook niet, maar ze zullen de algemene beveiligingsniveaus verbeteren.

MySQL is ook verouderd en zoals Christopher stelt, betekent het niet langer onderhouden dat het aantal gaten en problemen ermee alleen maar zullen toenemen naarmate andere technologieën zich blijven ontwikkelen.

Samenvatting

Als u MySQLi . schrijft statements op dezelfde manier als u MySQL-statements hebt geschreven, hebt u geen extra bescherming tegen injecties. MySQLi biedt echter de Prepared Statements aanpak die de verdediging tegen SQL-injectie aanzienlijk verhoogt, maar de verandering van de onderliggende database-interface op zich biedt u geen inherente voordelen of bescherming tenzij u ervoor kiest deze in uzelf te coderen met behulp van voorbereide instructies .



  1. MySQL-bestel berichten op meest recente opmerking OF laatst gepost

  2. connection.select_value retourneert alleen strings in postgres met pg gem

  3. Het begin van een mysql INT-veld opvullen met nullen

  4. Hoe native SQL-query's in dezelfde Hibernate-transactie uit te voeren?