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

mysql_escape_string sårbarheder

Det dårlige svar:

Ikke pålideligt. Du henviser til mysql_escape_string() , som ikke tager højde for forbindelseskodningen (mens mysql_real_escape_string() gør).

Så måske en omhyggeligt udformet streng med et omhyggeligt udformet ufuldstændigt UTF8-kodepunkt foran, resultere i, f.eks., at et citationstegn undslippes af mysql_escape_string() men selve flugten ignoreres af MySQL da det vil "se" det som et UTF8-tegn.

F.eks.:

0xC2' OR 1=1 ;--

ville blive escaped af mysql_escape_string() som

0xC2\' OR 1=1 ;--

som ville blive samlet til

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

og set af MySQL (hvis den korrekte forbindelseskodning var i kraft) som f.eks.

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

hvilket ville være en klassisk SQL-injektion.

Men dette spiller på det faktum, at du har angivet, måske gennem distraktion, en dobbelt forældet funktion . Hvis du virkelig henviste til mysql_real_escape_string() , så ville det ikke virke.

Dette forudsætter også, at hverken serveren eller applikationslaget (f.eks. PHP) anvender nogen form for tegnsætvalidering, når inputtet udfyldes. Hvis de gjorde det, ville den ugyldige UTF8 blive slettet ved ankomsten og aldrig engang blive set af mysql_escape_string , hvilket så selvfølgelig ville være nok.

Det rigtige svar:

Brug ikke mysql_escape_string (eller mysql_whatever ) overhovedet. De er blevet forældet, og din kode holder muligvis op med at virke. Brug PDO-funktioner i stedet.



  1. Sådan genereres et tilfældigt heltal inden for et område i MariaDB

  2. PostgreSQL-replikering til disaster recovery

  3. Migrering af MySQL til PostgreSQL på AWS RDS, del 4

  4. Hvordan fjerner jeg alle ikke-alfabetiske tegn fra streng i SQL Server?