Za prvé:nepoužívejte mysql_escape_string
, je zastaralá (z nějakého důvodu)!
Pokud musíte podporovat starší aplikaci, která se připojuje k databázi prostřednictvím mysql
rozšíření (které je zastaralé
), použijte mysql_real_escape_string
namísto. Jinak okamžitě přepnout
na mysqli
, kde připravené příkazy a vázané parametry poskytují robustnější mechanismus pro únik uživatelského vstupu.
To znamená, že odpověď lze nalézt přečtením popisu mysql_real_escape_string
a addslashes
:
Rozdíl č. 1
addslashes
neví nic o kódování připojení MySql. Pokud mu předáte řetězec obsahující bajty představující jiné kódování, než jaké používá připojení MySql, šťastně unikne všechny bajty s hodnotami znaků '
, "
, \
a \x00
. Toto nemusí být stejné jako všechny znaky '
, "
, \
a \x00
pokud používáte jiné kódování než 8bitové kódování a UTF-8. Výsledkem bude, že řetězec přijatý MySql bude poškozen.
Chcete-li spustit tuto chybu, zkuste použít iconv
převést vaši proměnnou na UTF-16 a poté ji ukončit pomocí addslashes
. Podívejte se, co vaše databáze přijímá.
To je jeden z důvodů, proč addslashes
by se nemělo používat k útěku.
Rozdíl č. 2
Na rozdíl od addslashes
, mysql_real_escape_string
také uvozuje znaky \r
, \n
a \x1a
. Zdá se, že tyto znaky musí být při komunikaci s MySql také escapovány, jinak může být výsledkem chybný dotaz
To je další důvod, proč addslashes
by se nemělo používat k útěku.