Mysql
 sql >> база данни >  >> RDS >> Mysql

Недостатъци на mysql_real_escape_string?

Основният недостатък на 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 че съм наясно сако се прилага правилно. Отново обаче основният проблем е, че е ужасяващо лесно да го приложите неправилно, което отваря уязвимости.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL формат за дата

  2. Как да получите първи запис във всяка група в MySQL

  3. Защо приблизителният брой редове е много различен в резултатите от phpmyadmin?

  4. Как да съхранявате данните в unicode на хинди език

  5. Как да инсталирам Python MySQLdb модул с помощта на pip?