elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.
 
Inicio Ayuda Buscar Ingresar Registrarse
28 Mayo 2012, 04:10  


Tema destacado: Suscripción al boletín mensual de elhacker.net

+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP
| | | |-+  Funcionamiento de mysql_real_escape_string()
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Funcionamiento de mysql_real_escape_string()  (Leído 2,387 veces)
Gambinoh

Desconectado Desconectado

Mensajes: 245



Ver Perfil WWW
Funcionamiento de mysql_real_escape_string()
« en: 30 Diciembre 2010, 18:55 »

Hola a todos. Tengo algunas dudas a cerca de la función de PHP mysql_real_escape_string.

Se el funcionamiento y he leído su descripción en php.net pero no comprendo del todo porqué evita una inyección sql.

Por ejemplo si  mysql_real_escape_string() escapa caracteres tipo ", ', *,/, etc. quiere decir que los interpreta no como comillas que contienen un string sino como parte del texto (según yo tengo entendido). Entonces si yo tengo este query:
Citar
$sql = "SELECT * FROM tabla WHERE campo = '$id' ORDER BY id ASC  LIMIT $inicio, $fin";

$query = mysql_query($sql);

La inyección sql debería de querer atacar reemplazando la variable $id por código que sería interpretado como una instrucción sql que en el peor de los casos directamente modificaría mi tabla o daría un error del que el "maleante xD" obtendría información.

Entonces el atacante escribiría algo como:

Citar
pagina.php?"codigomalicioso"=$id

Luego yo al usar en la recepción $_GET['id'], si lo coloco de esta manera estaría filtrando su comentario malicioso:

Citar
$id = mysql_real_escape_string($_GET['id']);

¿Entonces mysql_real_escape_string lo que haría es hacer que se vean todas las ",',*,/,etc. del códico o cómo?

Si estoy suponiendo alguna barbaridad decírmelo xD, sólo quiero enterarme de que falla en mi razonamiento.

Por otro lado parece que el peligro de la inyección sql en principio estaría en la recepción $_GET y $_POST de números, letras y operadores intruducidos vía URL.

Veo que hay gente que coloca entre dos puntos la $id tal que así:

Citar
... FROM tabla WHERE campo = '.$id.' ....

¿Explicación a esos dos puntos?

¿Alguien me explica la lógica de usar esto ( ' or '1'='1) como contraseña?  Or quiere decir True si alguna de las dos posibilidades es verdadera. La segunda está claro que lo es. ¿Las comillas son para simular espacios entre los operadores y los números?

Pero ¿en que afectaría usar ahí mysql_real_escape_string?

Que en lugar de or 1 = 1 se leería ' or '1'='1?

¿En que partes de mi código a parte de en aquellas en las que un valor es intruducido por URL y captado por GET o POST es necesario usar mysql_real_escape_string?






« Última modificación: 30 Diciembre 2010, 19:00 por Gambinoh » En línea
xassiz~


Desconectado Desconectado

Mensajes: 428



Ver Perfil WWW
Re: Funcionamiento de mysql_real_escape_string()
« Respuesta #1 en: 30 Diciembre 2010, 21:10 »

Con mysql_real_escape_string() haces que lo que escapes con ella no sea tomado como sentencia SQL.

Lo de la inyección ' or '1'='1.. imagínate un login tal que así:
Código
$queryLogin = mysql_query("SELECT * FROM admin WHERE usuario = '".$_POST['usuario']."' AND password = '".$_POST['password']."'");
 

Ahí la consulta quedaría por ejemplo:
Código
SELECT * FROM admin WHERE usuario = 'Gambinoh' AND password = '' OR '1'='1'

Intepretando que si el password es '' o si 1 es igual a 1, lo que sería verdadero.


Deberas incluir esa función siempre que la sentencia SQL vaya afectada por la acción del usuario.


En línea

Gambinoh

Desconectado Desconectado

Mensajes: 245



Ver Perfil WWW
Re: Funcionamiento de mysql_real_escape_string()
« Respuesta #2 en: 31 Diciembre 2010, 01:59 »

Claro, pero imagínate lo siguiente... tú dices cada vez, pero yo lo tengo así y creo que es igual, míralo y me lo confirmas.

Citar
//connect.php fuera de Document Root
include('archivos/connect.php');

mysql_select_db('base_de_datos', $conexion);

//Sólo las declaro una vez mediante mysql_real_escape_string
$id = mysql_real_escape_string($_GET['id']);
$pag = mysql_real_escape_string($_GET['pagina']);

//Aquí $id ya viene escapado y cuando llame a $pagina tmb
$sql = "SELECT * FROM tabla WHERE campo = '$id' ORDER BY id ASC  LIMIT $inicio, $fin";

//En este dato siguen estando escapadas las variables
$query = mysql_query($sql);

//Imprimo pero aquí no interviene tampoco el usuario que yo sepa

while($fila = mysql_fetch_assoc($query)) {
    echo $fila['campo_referencia'];

¿Donde pondrías tú la seguridad? es que yo lo veo bien, pero soy novato, igual me equivoco y hay fallos que podrían permitir una inyección sql.
« Última modificación: 31 Diciembre 2010, 02:02 por Gambinoh » En línea
xassiz~


Desconectado Desconectado

Mensajes: 428



Ver Perfil WWW
Re: Funcionamiento de mysql_real_escape_string()
« Respuesta #3 en: 31 Diciembre 2010, 13:05 »

Hombre no parece que haya errores, pero no se de donde sacas $inicio y $fin.
En línea

Gambinoh

Desconectado Desconectado

Mensajes: 245



Ver Perfil WWW
Re: Funcionamiento de mysql_real_escape_string()
« Respuesta #4 en: 31 Diciembre 2010, 17:08 »

Ok te explico... necesitaba las variables $inicio y $fin para con operadores matemáticos imprimir los resultados en dos bloques distintos (primero dos filas de la tabla en el primer bloque y luego tres filas en el segundo bloque) ya que entra siempre en juego una variable que es introducida por la URL que es en mi código "$pag".

O sea que si en la página pag=0 se imprimen 5 resultados siguiendo un orden Descendente con respecto al campo id, para que luego en pag=1 se impriman los otros 5 siguientes ha de variar el límite y para ello uso variables que representan números.

Es una chorrada en verdad. Lo que pasa es que no me expreso muy bien.


Venga un saludo y gracias ^^
En línea
xassiz~


Desconectado Desconectado

Mensajes: 428



Ver Perfil WWW
Re: Funcionamiento de mysql_real_escape_string()
« Respuesta #5 en: 31 Diciembre 2010, 19:33 »

Vale, mientras el usuario no ingrese esos datos sería seguro.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
mal funcionamiento
Grabadoras
ANNIBAL 8 1,277 Último mensaje 19 Enero 2003, 07:44
por Mordor
Funcionamiento FTP
Dudas Generales
iSr 2 952 Último mensaje 29 Octubre 2007, 01:35
por iSr
mysql_real_escape_string no es suficiente
Nivel Web
USUARIO_DE_SOFTWARE_LIBRE 1 7,418 Último mensaje 29 Agosto 2009, 19:37
por WHK
funcionamiento
Programación General
draco_er 1 1,001 Último mensaje 9 Febrero 2010, 21:26
por jdc
Problema cuando mysql_real_escape_string guarda las comillas
PHP
dimitrix 10 1,138 Último mensaje 28 Enero 2012, 21:39
por dimitrix
Powered by SMF 1.1.16 | SMF © 2006-2008, Simple Machines