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

Je nutné použít mysql_real_escape_string(), když je zapnutá magic_quotes_gpc?

Pro některá vzácná kódování jako GBk - Ano.
Ale neměli byste to z tohoto důvodu vrátit. Magické uvozovky by stejně měly být vypnuté (a budou v příští verzi PHP). Takže mysql_real_escape_string() je jediná funkce escape, která zbývá. Všimněte si, že se nejedná o funkci prevence vkládání SQL. Mnoho lidí tomuto bodu nerozumí:je to jen část syntaxe. Musí být použito nikoli k „ochraně“ čehokoli, ale k sestavení syntakticky správného SQL dotazu. A musí být použit pokaždé, když vytváříte dotaz, bez ohledu na to, odkud data pocházejí. Jistě vás také ochrání před injekcemi SQL jako vedlejší efekt.
Samozřejmě mysql_real_escape_string() funguje pouze v rámci řetězců v uvozovkách. Takže pokud ano

$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!

Nic to neochrání. Pokud budete používat čísla neuvozovaná, musí být přetypována na správný povinný typ, jako je tento:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Mějte na paměti, že mo make mysql_real_escape_string() funguje podle očekávání, mělo by být nastaveno správné kódování klienta a je to možné pouze pomocí mysql_set_charset() funkce, dotaz SET NAMES to nenastaví.

Pokud se chcete všech těchto složitostí zbavit, můžete použít připravená prohlášení , i když budete muset přepnout ovladač mysql na mysqli nebo PDO.

Vezměte prosím na vědomí, že žádná správná syntaxe ani připravené příkazy vám nepomohou s jinými částmi dotazu než literály. Nelze uniknout identifikátorům ani operátorům. Pokud náhodou používáte tyto části dynamicky, musí být pevně zakódovány ve vašem skriptu, takto (pro klauzuli ORDER BY):

$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";

nebo toto (klauzule WHERE)

$w=array();
if (!empty($_GET['rooms'])) $w[]="rooms='".mysql_real_escape_string($_GET['rooms'])."'";
if (!empty($_GET['space'])) $w[]="space='".mysql_real_escape_string($_GET['space'])."'";
if (!empty($_GET['max_price'])) $w[]="price < '".mysql_real_escape_string($_GET['max_price'])."'";

if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where='';
$query="select * from table $where";


  1. Jak funguje operátor LIKE v MySQL

  2. Představujeme novou funkci – Spotlight Cloud Replication

  3. Jak chránit databázi MySQL a MariaDB před kybernetickými útoky ve veřejné síti

  4. Je v MySQL dostupný příkaz merge