Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Alex_bro en 7 Febrero 2009, 22:55 pm



Título: Que finalidad tiene esto?
Publicado por: Alex_bro en 7 Febrero 2009, 22:55 pm
Buenas,
A ver si me pueden ayudar a entender que hacen estas 2 lineas de codigo...
   
Código
  1. if(get_magic_quotes_gpc()) $string = stripslashes($string);
  2. 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
  1. 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...


Título: Re: Que finalidad tiene esto?
Publicado por: Dacan en 7 Febrero 2009, 23:41 pm
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


Título: Re: Que finalidad tiene esto?
Publicado por: WHK en 8 Febrero 2009, 08:40 am
Código
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


Título: Re: Que finalidad tiene esto?
Publicado por: Agente Naranja en 12 Febrero 2009, 10:14 am
¿Y si quitas stripslashes y solamente usas el mysql_real_scape_string?


Título: Re: Que finalidad tiene esto?
Publicado por: WHK en 12 Febrero 2009, 21:48 pm
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
  1. <?php
  2. // Realizar un set_magic_quotes_runtime(0) con allstripslashses por WHK
  3.  
  4. // Uso:
  5. $_POST = allstripslashses($_POST);
  6. $_GET = allstripslashses($_GET);
  7. $_COOKIE = allstripslashses($_COOKIE);
  8. $_SERVER = allstripslashses($_SERVER);
  9. $_REQUEST = allstripslashses($_REQUEST);
  10. $palabra = allstripslashses("cmd /c echo \'%homedrive%\\ = c:\\\' ");
  11.  
  12. // Imprime resultados
  13. echo htmlspecialchars($palabra, ENT_QUOTES);
  14. echo '<br />Arrays totales:<br />';
  15. print_r($_POST);
  16. print_r($_GET);
  17. print_r($_COOKIE);
  18. print_r($_SERVER);
  19. print_r($_REQUEST);
  20.  
  21. // Función
  22. function allstripslashses($data){
  23. if(is_array($data)){
  24.  foreach($data as $variable => $valor){
  25.   $retorno[stripslashes($variable)] = stripslashes($valor);
  26.  }
  27.  return $retorno;
  28. }else{
  29.  return stripslashes($data);
  30. }
  31. }
  32.  
  33. ?>

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).