Лошият отговор:
Не надеждно. Имате предвид mysql_escape_string()
, което не взема предвид кодирането на връзката (докато mysql_real_escape_string()
прави).
Така че може би внимателно изработен низ, с внимателно изработена непълна UTF8 кодова точка отпред, може да доведе до, да речем, екраниране на знак за кавички от mysql_escape_string()
но самото escape се игнорира от MySQL тъй като ще го "види" като UTF8 символ.
Напр.:
0xC2' OR 1=1 ;--
ще бъде екраниран от mysql_escape_string()
като
0xC2\' OR 1=1 ;--
който ще бъде сглобен за
WHERE password='0xC2\' OR 1=1 ;--';
и се вижда от MySQL (ако е в сила правилното кодиране на връзката) като, да речем,
WHERE password='€' OR 1=1 ;[--';] <-- the bracketed part is considered a comment and ignored
което би било класическа SQL инжекция.
Но това се отразява на факта, че сте посочили, може би чрез разсейване, двойно отхвърлена функция . Ако наистина имате предвид mysql_real_escape_string()
, тогава няма да работи.
Също така, това предполага, че нито сървърът, нито слоят на приложението (например PHP) използват какъвто и да е вид проверка на набор от знаци при попълване на входа. Ако го направят, невалидният UTF8 ще бъде изтрит при пристигането и дори никога не ще бъде видян от mysql_escape_string
, което тогава разбира се би било достатъчно.
Истинският отговор:
Не използвайте mysql_escape_string
(или mysql_whatever
) изобщо. Те са оттеглени и кодът ви може да спре да работи. Вместо това използвайте PDO функции.