Que finalidad tiene esto?

Iniciado por Alex_bro, 7 Febrero 2009, 22:55 PM

0 Miembros y 1 Visitante están viendo este tema.

Alex_bro

Buenas,
A ver si me pueden ayudar a entender que hacen estas 2 lineas de codigo...
   
Código (php) [Seleccionar]
if(get_magic_quotes_gpc()) $string = stripslashes($string);
return mysql_real_escape_string($string);

A mi entender, al detectar las magic quotes activadas les quita las barras para luego volverselas a poner con mysql_real_escape_string();
Estas lineas las encontre en una clase para conectar con mysql.
No seria mas logico lo siguiente?
   
Código (php) [Seleccionar]
if(!get_magic_quotes_gpc()) $string = mysql_real_escape_string($string);
return $string;


El problema es que esta clase cuando te devulve un query les quita de nuevo las barras con stripslashes, y ya me tiene loco! Si lo dejo como viene me borra la mitad de las barras que introduce el usuario (y solo quiero escaparlas para evitar sql injection, no borrarlas) y si lo quito si que me devulve la cadena tal y como la introduzco... por lo cual no se habrian escapado los caracteres en el query...

Gracias!
PD: Estudiando mi script, me doy cuenta de que aunque get_magic_guotes_gpc() devuelve TRUE en el servidor, realmente no escapa ningun caracter y me esta volviendo loco!

EDITO:
Es posible hacer algo malicioso si escapo las comillas con htmlentities y dejo todo lo demas? Asi me evito todos estos lios de slashes y demas...

Dacan

Se traduce como si las magic quotes no están activadas se le pasa la función mysql_real_escape_string a la variable.

Saludos, Dacan  :D

WHK

Código (php) [Seleccionar]
return mysql_real_escape_string(stripslashes($string));
Mas corto y ya, con eso ya no te pueden joder con una sql inyeccion a menos que procese algun dato sin encerrarse en comillas o integrar integers sin filtrar (int)$val, todo depende de $string

Agente Naranja

¿Y si quitas stripslashes y solamente usas el mysql_real_scape_string?

WHK

#4
Así es pero por lo general una buena programación te hace filtrar las variables antes de ser utilizadas removiendo los slashses y después de eso continúa todo el script y evitas tener que filtrar los datos con esa función cada ves que metas valores en funciones o algo.

Código (php) [Seleccionar]
<?php
// Realizar un set_magic_quotes_runtime(0) con allstripslashses por WHK

// Uso:
$_POST allstripslashses($_POST);
$_GET allstripslashses($_GET);
$_COOKIE allstripslashses($_COOKIE);
$_SERVER allstripslashses($_SERVER);
$_REQUEST allstripslashses($_REQUEST);
$palabra allstripslashses("cmd /c echo \'%homedrive%\\ = c:\\\' ");

// Imprime resultados
echo htmlspecialchars($palabraENT_QUOTES);
echo 
'<br />Arrays totales:<br />';
print_r($_POST);
print_r($_GET);
print_r($_COOKIE);
print_r($_SERVER);
print_r($_REQUEST);

// Función
function allstripslashses($data){
 if(
is_array($data)){
  foreach(
$data as $variable => $valor){
   
$retorno[stripslashes($variable)] = stripslashes($valor);
  }
  return 
$retorno;
 }else{
  return 
stripslashes($data);
 }
}

?>


Es casi lo mismo que utilizar set_magic_quotes_runtime(0) solo que en algunos servidores no puedes utilizar esta función así que apelas a un poco de ingenio para crear el mismo resultado.

Cuando quieras hacer una query ahora en mysql puedes hacerla directamente con mysql_real_escape_string($string).