Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

É necessário usar mysql_real_escape_string(), quando magic_quotes_gpc está ativado?


Para algumas codificações raras, como GBk - sim.
Mas você deve reverter não por esse motivo. Aspas mágicas devem ser desativadas de qualquer maneira (e estarão na próxima versão do PHP). Então, mysql_real_escape_string() é a única função de escape que resta. Observe que não é uma função de prevenção de injeção de SQL. Muitas pessoas não entendem este ponto:é apenas uma parte da sintaxe. Ele deve ser usado não para "proteger" nada, mas para montar uma consulta SQL sintaticamente correta. E deve ser usado sempre que você criar sua consulta, não importa de onde os dados venham. Claro que também irá protegê-lo de injeções de SQL, como efeito colateral.
Claro, mysql_real_escape_string() funciona apenas dentro de strings entre aspas. Então, se você fizer
$num=mysql_real_escape_string($num);
$sql="SELECT INTO table SET data=$num"; /BAD!!!

Não protegerá nada. Se você for usar números sem aspas, deve ser convertido para o tipo apropriado obrigatório, assim:
$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Lembre-se de que você faz mysql_real_escape_string() funciona como pretendido, a codificação de cliente adequada deve ser definida e é possível somente com mysql_set_charset() função, a consulta SET NAMES não definirá isso.

Se você quiser se livrar de todas essas complexidades, você pode usar declarações preparadas , embora você precise mudar seu driver mysql para mysqli ou PDO.

Observe que nenhuma sintaxe adequada nem instruções preparadas não o ajudariam com partes de consulta que não fossem literais. Você não pode escapar de Identificadores ou operadores. Se você usar essas partes dinamicamente, elas devem ser codificadas em seu script, assim (para a cláusula ORDER BY):
$orders=array("name","price","qty");
$key=array_search($_GET['sort'],$orders));
$orderby=$orders[$key];
$query="SELECT * FROM `table` ORDER BY $orderby";

ou esta (cláusula 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";