sql >> Database >  >> RDS >> Mysql

mysql_escape_string kwetsbaarheden

Het slechte antwoord:

Niet betrouwbaar. Je verwijst naar mysql_escape_string() , die geen rekening houdt met de verbindingscodering (terwijl mysql_real_escape_string() doet).

Dus misschien een zorgvuldig vervaardigde string, met een zorgvuldig vervaardigd onvolledig UTF8-codepunt ervoor, misschien resulteren in, laten we zeggen, een aanhalingsteken dat wordt ontsnapt door mysql_escape_string() maar de ontsnapping zelf wordt genegeerd door MySQL omdat het het zal "zien" als een UTF8-teken.

Bijv.:

0xC2' OR 1=1 ;--

zou worden ontsnapt door mysql_escape_string() als

0xC2\' OR 1=1 ;--

die zou worden geassembleerd om

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

en gezien door MySQL (als de juiste verbindingscodering van kracht was) als, laten we zeggen,

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

wat een klassieke SQL-injectie zou zijn.

Maar dit speelt in op het feit dat je, misschien door afleiding, een dubbel afgekeurde functie hebt gespecificeerd . Als je echt verwijst naar mysql_real_escape_string() , dan zou het niet werken.

Dit veronderstelt ook dat noch de server, noch de applicatielaag (bijv. PHP) enige vorm van karakterset-validatie gebruikt bij het vullen van de invoer. Als ze dat deden, zou de ongeldige UTF8 bij aankomst worden verwijderd en zelfs nooit worden gezien door mysql_escape_string , wat dan natuurlijk genoeg zou zijn.

Het echte antwoord:

Gebruik geen mysql_escape_string (of mysql_whatever ) helemaal niet. Ze zijn verouderd en uw code werkt mogelijk niet meer. Gebruik in plaats daarvan PDO-functies.



  1. Hoe het volgende gratis unieke 4-cijferige nummer te vinden

  2. Inzicht in het opslaan van gegevens in SQL-databases door Android.com Zelfstudie

  3. Controleer of de kolom bestaat, zo niet, voeg MySQL toe via PHP

  4. controleer of er een waarde bestaat in json encode array in mysql