Zła odpowiedź:
Nie rzetelnie. Odnosisz się do mysql_escape_string()
, który nie uwzględnia kodowania połączenia (podczas gdy mysql_real_escape_string()
tak).
Może więc starannie spreparowany ciąg, ze starannie spreparowanym niekompletnym kodem UTF8 na początku, może w wyniku, powiedzmy, znak cudzysłowu zostanie zmieniony przez mysql_escape_string()
ale sama ucieczka jest ignorowana przez MySQL ponieważ "zobaczy" to jako znak UTF8.
Np.:
0xC2' OR 1=1 ;--
zostanie zmieniony przez mysql_escape_string()
jako
0xC2\' OR 1=1 ;--
które zostaną zmontowane do
WHERE password='0xC2\' OR 1=1 ;--';
i widziany przez MySQL (jeśli działało właściwe kodowanie połączenia) jako, powiedzmy,
WHERE password='€' OR 1=1 ;[--';] <-- the bracketed part is considered a comment and ignored
co byłoby klasycznym wstrzyknięciem SQL.
Ale to zależy od tego, że określiłeś, być może przez odwrócenie uwagi, podwójnie przestarzałą funkcję . Jeśli naprawdę miałeś na myśli mysql_real_escape_string()
, to by nie zadziałało.
Zakłada to również, że ani serwer, ani warstwa aplikacji (np. PHP) nie stosują żadnego rodzaju walidacji zestawu znaków podczas wypełniania danych wejściowych. Gdyby tak się stało, nieprawidłowy kod UTF8 zostałby usunięty po przybyciu i nigdy nawet nie był widziany przez mysql_escape_string
, co wtedy oczywiście wystarczy.
Prawdziwa odpowiedź:
Nie używaj mysql_escape_string
(lub mysql_whatever
) w ogóle. Zostały przestarzałe i Twój kod może przestać działać. Zamiast tego użyj funkcji PDO.