sql >> Databáze >  >> RDS >> Mysql

zranitelnosti mysql_escape_string

Špatná odpověď:

Ne spolehlivě. Máte na mysli mysql_escape_string() , který nebere v úvahu kódování připojení (zatímco mysql_real_escape_string() ano).

Takže možná pečlivě vytvořený řetězec s pečlivě vytvořeným neúplným kódovým bodem UTF8 vpředu mohl mít za následek, řekněme, znak uvozovky, který je escapován pomocí mysql_escape_string() ale samotný únik MySQL ignoruje protože jej „uvidí“ jako znak UTF8.

Např.:

0xC2' OR 1=1 ;--

bude escapováno pomocí mysql_escape_string() jako

0xC2\' OR 1=1 ;--

které by byly sestaveny do

WHERE password='0xC2\' OR 1=1 ;--';

a vidí to MySQL (pokud bylo správné kódování připojení účinné) jako, řekněme,

WHERE password='€' OR 1=1 ;[--';]    <-- the bracketed part is considered a comment and ignored

což by byla klasická injekce SQL.

Ale to hraje na fakt, že jste zadali, možná prostřednictvím rozptýlení, dvojitě zastaralou funkci . Pokud jste skutečně odkazovali na mysql_real_escape_string() , pak by to nefungovalo.

Také to předpokládá, že ani server, ani aplikační vrstva (např. PHP) nevyužívá žádný druh ověření znakové sady při naplňování vstupu. Pokud by to udělali, neplatný kód UTF8 by byl při příjezdu smazán a nikdy by ho ani mysql_escape_string neviděl , což by pak samozřejmě stačilo.

Skutečná odpověď:

Nepoužívejte mysql_escape_string (nebo mysql_whatever ) vůbec. Jejich podpora byla ukončena a váš kód může přestat fungovat. Místo toho použijte funkce PDO.



  1. SqlNullValueException při provádění uložené procedury pomocí MySqlCommand

  2. MySqlConnection.StateChange se nikdy nenačítá

  3. Vytvořit databázovou tabulku ActiveRecord bez sloupce :id?

  4. Ukládání dat UTF-16/Unicode na SQL Server