sql >> Databasteknik >  >> RDS >> Mysql

mysql_escape_string sårbarheter

Det dåliga svaret:

Inte tillförlitligt. Du syftar på mysql_escape_string() , som inte tar hänsyn till anslutningskodningen (medan mysql_real_escape_string() gör).

Så kanske en noggrant utformad sträng, med en noggrant utformad ofullständig UTF8-kodpunkt framför, kan resultera i att t.ex. ett citattecken escapes av mysql_escape_string() men själva flykten ignoreras av MySQL eftersom det kommer att "se" det som ett UTF8-tecken.

T.ex.:

0xC2' OR 1=1 ;--

skulle undvikas av mysql_escape_string() som

0xC2\' OR 1=1 ;--

som skulle monteras till

WHERE password='0xC2\' OR 1=1 ;--';

och ses av MySQL (om korrekt anslutningskodning var i kraft) som, säg,

WHERE password='€' OR 1=1 ;[--';]    <-- the bracketed part is considered a comment and ignored

vilket skulle vara en klassisk SQL-injektion.

Men detta spelar på det faktum att du angav, kanske genom distraktion, en dubbelt utfasad funktion . Om du verkligen syftade på mysql_real_escape_string() , då skulle det inte fungera.

Detta förutsätter också att varken servern eller applikationslagret (t.ex. PHP) använder någon form av teckenuppsättningsvalidering när indata fylls i. Om de gjorde det skulle den ogiltiga UTF8 raderas vid ankomsten och aldrig ens ses av mysql_escape_string , vilket då naturligtvis skulle räcka.

Det verkliga svaret:

Använd inte mysql_escape_string (eller mysql_whatever ) alls. De har fasats ut och din kod kan sluta fungera. Använd PDO-funktioner istället.



  1. Skapa en vy med kolumn num_rows - MySQL

  2. När jag ansluter till fjärrkontrollen min SQL visar jag åtkomst nekad för användare [email protected] ( Använder lösenord :Ja )

  3. Varför använda ramverk? Övertyga mig om att jag borde ta reda på Zend Framework och använda det

  4. Valfria kolumner för att filtrera databasposter