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

mysql_escape_string уязвимости

Лошият отговор:

Не надеждно. Имате предвид 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 функции.



  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. PyMySQL различни актуализации в една заявка?

  3. MySQL бърз съвет:Използване на функцията LENGTH и TRIM

  4. MySQL в облака – онлайн миграция от Amazon RDS към EC2 екземпляр:Част първа

  5. Кое е най-доброто съпоставяне за MySQL с PHP?