Špatná odpověď:
Ne spolehlivě. Máte na mysli mysql_escape_string()
, který nebere v úvahu kódování připojení (zatímco mysql_real_escape_string()
ano).
Takže možná pečlivě vytvořený řetězec s pečlivě vytvořeným neúplným kódovým bodem UTF8 vpředu mohl mít za následek, řekněme, znak uvozovky, který je escapován pomocí mysql_escape_string()
ale samotný únik MySQL ignoruje protože jej „uvidí“ jako znak UTF8.
Např.:
0xC2' OR 1=1 ;--
bude escapováno pomocí mysql_escape_string()
jako
0xC2\' OR 1=1 ;--
které by byly sestaveny do
WHERE password='0xC2\' OR 1=1 ;--';
a vidí to MySQL (pokud bylo správné kódování připojení účinné) jako, řekněme,
WHERE password='€' OR 1=1 ;[--';] <-- the bracketed part is considered a comment and ignored
což by byla klasická injekce SQL.
Ale to hraje na fakt, že jste zadali, možná prostřednictvím rozptýlení, dvojitě zastaralou funkci . Pokud jste skutečně odkazovali na mysql_real_escape_string()
, pak by to nefungovalo.
Také to předpokládá, že ani server, ani aplikační vrstva (např. PHP) nevyužívá žádný druh ověření znakové sady při naplňování vstupu. Pokud by to udělali, neplatný kód UTF8 by byl při příjezdu smazán a nikdy by ho ani mysql_escape_string
neviděl , což by pak samozřejmě stačilo.
Skutečná odpověď:
Nepoužívejte mysql_escape_string
(nebo mysql_whatever
) vůbec. Jejich podpora byla ukončena a váš kód může přestat fungovat. Místo toho použijte funkce PDO.