Jeg er blevet forledt til at tro, at:
$selection = mysql_query($dblink, "SELECT * FROM table WHERE name='$idValue' ");
kan nemt kompromitteres med værdier for $idValue
som lukker '
og tilføj derefter ekstra kommandoer, såsom
$idValue = "z'; DELETE * FROM table WHERE name IS NOT NULL";
Selvom jeg er klar over, at du siger, at flere udsagn er deaktiveret, ville noget, der ikke er så forfærdeligt, være at returnere uautoriserede data i stedet for at redigere data i tabellen direkte, såsom:
$idValue = "z' OR name IS NOT NULL OR name = 'x";
Mens der med MySQLi er muligheden at tilgangen kan bruges med prepared statements
, hvilket ville forhindre variablen i at fungere uden for sin status som blot en variabel. Såsom:
mysqli->prepare("SELECT * FROM tables WHERE name = ? LIMIT 1");
mysqli->bind_param("s",$idValue);
mysqli->execute();
Min forståelse af bind_param
er, at variablen ville have alle MySQL-nøgleord og nøgletegn escaped, hvilket forhindrer sikkerhedsbrud og returnering af uautoriserede rækker.
Dette er et valg, som MySQL ikke har . Forberedte erklæringer hjælper med at forbedre injektionssikkerhed, men de vil ikke forhindre injektionsangreb alene, men flere bør bruges som en del af en bredere strategi af programmøren.
Ligesom at bære rustning ikke vil gøre dig uovervindelig, men det vil i høj grad forbedre dine chancer for at overleve. MySQLi er ikke en magisk kugle, og det er PDO heller ikke, men de vil forbedre sikkerhedsniveauet generelt.
MySQL er også forældet, og som anført af Christopher betyder det, at det ikke længere vedligeholdes, at antallet af huller og problemer med det kun vil stige, efterhånden som andre teknologier fortsætter med at udvikle sig.
Oversigt
Hvis du skriver MySQLi udsagn på samme måde som du skrev MySQL-udsagn, så har du ingen yderligere beskyttelse mod injektioner. MySQLi tilbyder dog de Forberedte erklæringer tilgang, som øger forsvaret mod SQL-injektion markant, men ændringen af den underliggende databasegrænseflade i sig selv giver dig ikke nogen iboende fordele eller beskyttelser medmindre du vælger at kode disse i dig selv ved hjælp af forberedte sætninger .