elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  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 10,265 veces)
Gambinoh


Desconectado Desconectado

Mensajes: 389



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

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 pm por Gambinoh » En línea

xassiz~


Desconectado Desconectado

Mensajes: 457



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

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
  1. $queryLogin = mysql_query("SELECT * FROM admin WHERE usuario = '".$_POST['usuario']."' AND password = '".$_POST['password']."'");
  2.  

Ahí la consulta quedaría por ejemplo:
Código
  1. 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: 389



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

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 am por Gambinoh » En línea

xassiz~


Desconectado Desconectado

Mensajes: 457



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

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

Gambinoh


Desconectado Desconectado

Mensajes: 389



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

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: 457



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

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
Software
ANNIBAL 8 3,719 Último mensaje 19 Enero 2003, 07:44 am
por Mordor
Funcionamiento de un joiner?
Programación Visual Basic
[D4N93R] 3 1,271 Último mensaje 23 Diciembre 2005, 23:25 pm
por [D4N93R]
mysql_real_escape_string no es suficiente
Nivel Web
USUARIO_DE_SOFTWARE_LIBRE 1 13,176 Último mensaje 29 Agosto 2009, 19:37 pm
por WHK
Problema cuando mysql_real_escape_string guarda las comillas « 1 2 »
PHP
dimitrix 10 5,700 Último mensaje 28 Enero 2012, 21:39 pm
por dimitrix
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines