Основният недостатък на mysql_real_escape_string
, или на разширението mysql_ като цяло, е, че е по-трудно да се приложи правилно от други, по-модерни API, особено подготвени оператори. mysql_real_escape_string
се предполага, че се използва точно в един случай:избягване на текстово съдържание, което се използва като стойност в SQL израз между кавички. Напр.:
$value = mysql_real_escape_string($value, $link);
$sql = "... `foo` = '$value' ...";
^^^^^^
mysql_real_escape_string
гарантира, че $value
в горния контекст не обърква синтаксиса на SQL. Тук не работи, както може би си мислите:
$sql = "... `foo` = $value ...";
или тук:
$sql = "... `$value` ...";
или тук:
$sql = mysql_real_escape_string("... `foo` = '$value' ...");
Ако се приложи към стойности, които се използват в какъвто и да е контекст, различен от низ в кавички в SQL израз, той се прилага неправилно и може или не може да обърка получения синтаксис и/или да позволи на някого да подаде стойности, които могат да позволят атаки с инжектиране на SQL. Случаят на използване на mysql_real_escape_string
е много тесен, но рядко се разбира правилно.
Друг начин да влезете в гореща вода с помощта на mysql_real_escape_string
е, когато зададете кодирането на връзката към базата данни, като използвате грешен метод. Трябва да направите това:
mysql_set_charset('utf8', $link);
Вие можете направете и това:
mysql_query("SET NAMES 'utf8'", $link);
Проблемът е, че последният заобикаля mysql_ API, който все още смята, че разговаряте с базата данни с помощта на latin1
(или нещо друго). Когато използвате mysql_real_escape_string
сега той ще приеме грешно кодиране на символи и escape низове по различен начин, отколкото базата данни ще ги интерпретира по-късно. Като стартирате SET NAMES
query, създадохте разрив между начина, по който клиентският API на mysql_ третира низовете и как базата данни ще интерпретира тези низове. Това може да се използва за атаки с инжектиране в определени ситуации с многобайтов низ.
Няма фундаментални уязвимости при инжектиране в mysql_real_escape_string
че съм наясно сако се прилага правилно. Отново обаче основният проблем е, че е ужасяващо лесно да го приложите неправилно, което отваря уязвимости.