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

Jaký je rozdíl mezi addlashes PHP a mysql(i)_escape_string?

Za prvé:nepoužívejte mysql_escape_string , je zastaralá (z nějakého důvodu)!

Pokud musíte podporovat starší aplikaci, která se připojuje k databázi prostřednictvím mysql rozšíření (které je zastaralé ), použijte mysql_real_escape_string namísto. Jinak okamžitě přepnout na mysqli , kde připravené příkazy a vázané parametry poskytují robustnější mechanismus pro únik uživatelského vstupu.

To znamená, že odpověď lze nalézt přečtením popisu mysql_real_escape_string a addslashes :

Rozdíl č. 1

addslashes neví nic o kódování připojení MySql. Pokud mu předáte řetězec obsahující bajty představující jiné kódování, než jaké používá připojení MySql, šťastně unikne všechny bajty s hodnotami znaků ' , " , \ a \x00 . Toto nemusí být stejné jako všechny znaky ' , " , \ a \x00 pokud používáte jiné kódování než 8bitové kódování a UTF-8. Výsledkem bude, že řetězec přijatý MySql bude poškozen.

Chcete-li spustit tuto chybu, zkuste použít iconv převést vaši proměnnou na UTF-16 a poté ji ukončit pomocí addslashes . Podívejte se, co vaše databáze přijímá.

To je jeden z důvodů, proč addslashes by se nemělo používat k útěku.

Rozdíl č. 2

Na rozdíl od addslashes , mysql_real_escape_string také uvozuje znaky \r , \n a \x1a . Zdá se, že tyto znaky musí být při komunikaci s MySql také escapovány, jinak může být výsledkem chybný dotaz

To je další důvod, proč addslashes by se nemělo používat k útěku.



  1. Dílčí dotazy SQL v kontrolním omezení

  2. MySql:Spočítá, kolikrát se slova vyskytují ve sloupci

  3. Vytvořte novou tabulku sloučením dvou tabulek pomocí unie

  4. dva cizí klíče, jak mapovat pomocí laravel výmluvný