Mysql
 sql >> Database >  >> RDS >> Mysql

Un attacco injection che riesce con mysql_query, ma non riesce con mysqli_query

Sono stato portato a credere che:

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

può essere facilmente compromesso con i valori per $idValue che chiudono il ' e quindi aggiungi comandi extra, come

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

Anche se mi rendo conto che affermi che più istruzioni sono disabilitate, qualcosa di non così orribile sarebbe restituire dati non autorizzati piuttosto che modificare direttamente i dati nella tabella, come ad esempio:

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

Mentre con MySQLi c'è la possibilità che l'approccio può essere utilizzato con prepared statements , che impedirebbe alla variabile di agire al di fuori del suo stato di semplice variabile. Ad esempio:

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

La mia comprensione di bind_param è che la variabile avrebbe tutte le parole chiave e i caratteri chiave MySQL sfuggiti, impedendo così la violazione della sicurezza e il ritorno di righe non autorizzate.

Questa è una scelta che MySQL non ha . Le dichiarazioni preparate aiutano a migliorare sicurezza dell'iniezione, ma non impediranno solo attacchi injection, ma ne dovrebbero essere usati altri come parte di una strategia più ampia da parte del programmatore.

Proprio come indossare un'armatura non ti renderà invincibile, ma migliorerà notevolmente le tue possibilità di sopravvivenza. MySQLi non è una bacchetta magica, e nemmeno PDO, ma miglioreranno i livelli di sicurezza in generale.

Anche MySQL è deprecato e, come affermato da Christopher, non essere più mantenuto significa che il numero di buchi e problemi aumenterà solo con lo sviluppo di altre tecnologie.

Riepilogo

Se scrivi MySQLi istruzioni nello stesso modo in cui hai scritto le istruzioni MySQL, non avrai alcuna protezione aggiuntiva dalle iniezioni. Tuttavia, MySQLi offre le Dichiarazioni preparate approccio che aumenta significativamente la difesa contro l'iniezione di SQL, ma la modifica dell'interfaccia del database sottostante di per sé non offre vantaggi o protezioni intrinseche a meno che tu non scelga di codificarli da solo utilizzando istruzioni preparate .