Buenas,
A ver si me pueden ayudar a entender que hacen estas 2 lineas de codigo...
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?
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...
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
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
¿Y si quitas stripslashes y solamente usas el mysql_real_scape_string?
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.
<?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($palabra, ENT_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).