sql >> Base de Datos >  >> RDS >> Mysql

¿Es necesario usar mysql_real_escape_string(), cuando magic_quotes_gpc está activado?

Para algunas codificaciones raras, como GBk - Sí.
Pero deberías revertirlo no por este motivo. Las comillas mágicas deben desactivarse de todos modos (y estarán en la próxima versión de PHP). Entonces, mysql_real_escape_string() es la única función de escape que queda. Tenga en cuenta que no es una función de prevención de inyección de SQL. Mucha gente no entiende este punto:es solo una parte de la sintaxis. Debe usarse no para "proteger" nada, sino para ensamblar consultas SQL sintácticamente correctas. Y debe usarse cada vez que crea su consulta, sin importar de dónde provengan los datos. Seguro que también lo protegerá de las inyecciones de SQL, como efecto secundario.
Por supuesto, mysql_real_escape_string() funciona solo dentro de cadenas entre comillas. Entonces, si lo haces

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

No protegerá nada. Si va a utilizar números sin comillas, debe convertirlos en el tipo adecuado obligatorio, como este:

$num=intval($num);
$sql="SELECT INTO table SET data=$num"; /GOOD
  • Tenga en cuenta que mo make mysql_real_escape_string() funciona según lo previsto, se debe establecer la codificación de cliente adecuada y es posible solo con mysql_set_charset() función, la consulta SET NAMES no establecerá eso.

Si desea deshacerse de todas estas complejidades, puede usar declaraciones preparadas , aunque deberá cambiar su controlador mysql a mysqli o PDO.

Tenga en cuenta que ninguna sintaxis adecuada ni declaraciones preparadas no lo ayudarían con partes de consulta que no sean literales. No puede escapar de los identificadores u operadores. Si usa estas partes dinámicamente, deben estar codificadas en su secuencia de comandos, así (para la 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";

o esto (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";