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

Nelze použít mysql_real_escape_string

První bod:Pokud se vám zobrazuje chyba z mysql_real_escape_string() , je to proto, že funkci voláte předtím, než se připojíte k databázi.

Vypadá to, že se připojíte k databázi těsně před spuštěním dotazu. Takže cokoli uděláte, než zavoláte mm_mysqlquery() funkce nebude mít připojení.

mysql_real_escape_string() Funkce potřebuje živé připojení k databázi, takže může provést správný druh escapování s ohledem na znakovou sadu připojení. Musíte se tedy připojit před uděláte útěk.

Stejně je lepší to udělat, protože pokud uděláte několik dotazů v průběhu jednoho požadavku PHP, je méně režijní na připojení jednou a použijte stejné připojení pro všechny vaše dotazy.

Za druhé, neberte prosím návrhy na použití addslashes() -- nedělá to samé jako mysql_real_escape_string() . Tyto dva nejsou zaměnitelné. Měli byste si zvyknout používat mysql_real_escape_string() .

Za třetí, vaše sani() funkce ukazuje běžnou mylnou představu.

function sani($string){     
  $string = strip_tags($string); 
  $string = htmlspecialchars($string); 
  $string = trim(rtrim(ltrim($string))); 
  $string = mysql_real_escape_string($string);
  return $string;
}

Obecná mylná představa je, že potřebujete všechny tyto funkce, aby byl řetězec bezpečný v příkazu SQL. Ty ne. Pouze mysql_real_escape_string() je nutné. Všechny ostatní funkce v tomto příkladu nedělají nic pro ochranu před SQL injection.

Tyto funkce jsou užitečné, pokud výstup řetězce v prezentaci HTML a chcete snížit riziko útoků XSS, ale pak mysql_real_escape_string() je irelevantní.

Používejte každý typ dezinfekční metody v příslušném kontextu.



  1. Odstraňte duplicitní řádky s počtem větším než 1 v mysql

  2. Kontrola verzí MySQL - Subversion

  3. Funkce PostgreSQL / Uložená procedura CURRENT_TIMESTAMP se nemění

  4. Dotaz na uživatele, kteří nejsou v konkrétní skupině? (Chtěl jsem použít EXCEPT, ale zdá se, že MySQL to nepodporuje)