sql >> Databasteknik >  >> RDS >> Mysql

En injektionsattack som lyckas med mysql_query, men misslyckas med mysqli_query

Jag har fått mig att tro att:

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

kan enkelt äventyras med värden för $idValue som stänger ' och lägg sedan till extra kommandon, såsom

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

Även om jag inser att du anger att flera uttalanden är inaktiverade, skulle något som inte är lika hemskt vara att returnera obehörig data snarare än att redigera data i tabellen direkt, som:

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

Medan MySQLi finns möjlighet att tillvägagångssättet kan användas med prepared statements , vilket skulle förhindra att variabeln agerar utanför sin status som bara en variabel. Såsom:

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

Jag förstår bind_param är att variabeln skulle ha undangått alla MySQL-sökord och nyckeltecken, vilket förhindrar säkerhetsintrång och återkomst av obehöriga rader.

Detta är ett val som MySQL inte har . Förberedda uttalanden hjälper till att förbättra injektionssäkerhet men de kommer inte att förhindra enbart injektionsattacker, men fler bör användas som en del av en bredare strategi av programmeraren.

Precis som att bära kroppsskydd inte kommer att göra dig oövervinnerlig, men det kommer att avsevärt förbättra dina chanser att överleva. MySQLi är inte en magisk kula, och inte heller PDO, men de kommer att förbättra säkerhetsnivåerna överlag.

MySQL är också föråldrat och som Christopher har sagt, att inte längre underhållas innebär att antalet hål och problem med det bara kommer att öka i takt med att andra teknologier fortsätter att utvecklas.

Sammanfattning

Om du skriver MySQLi uttalanden på samma sätt som du skrev MySQL-uttalanden, då har du inget extra skydd mot injektioner. MySQLi erbjuder dock Förberedda uttalanden tillvägagångssätt som avsevärt ökar försvaret mot SQL-injektion, men förändringen av det underliggande databasgränssnittet i sig ger dig inga inneboende fördelar eller skydd om du inte väljer att koda dessa i dig själv med förberedda satser .



  1. Så här fixar du:Ingen lämplig drivrutin hittades för jdbc:mysql://localhost/dbname-fel när du använder pooler?

  2. Hur man tar bort ledande blanksteg i MySQL

  3. "Är det hemligt? Är det säkert?" Hantera känsliga data i din datamodellering

  4. Gå med i tre bord med MySQL