Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Seguridad en una consulta php mysql

Estas en el tema de Seguridad en una consulta php mysql en el foro de PHP en Foros del Web. Hola a todos, solo quisiera que me dieran algunos consejos sobre que cosas debería tener en cuenta o hacer para tener seguridad en una consulta ...
  #1 (permalink)  
Antiguo 31/08/2013, 15:31
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Seguridad en una consulta php mysql

Hola a todos, solo quisiera que me dieran algunos consejos sobre que cosas debería tener en cuenta o hacer para tener seguridad en una consulta e impedir por ejemplo inyecciones sql.
1. Cómo y cuando debo usar mysql_real_escape_string() o htmlentities()? Ejemplos sencillos por favor.
2. ¿mysql_real_escape_string() o htmlentities() solo se usan en un select (antes, durante o despues) o hay que usarlo tambien en un insert, delete, etc.?

3. ¿Cómo podría proteger el siguiente código?
Cita:
$consulta_calorias_restantes=mysql_query("SELECT calorias_restantes FROM usuarios ORDER BY calorias_restantes ASC LIMIT 1",$Conexion);
4. Se que es mucho pedir, pero: mySQLi le da más seguridad que mySQL? ¿Alcanza con añadir una i o debo hacer modificaciones paso a paso e ir comprobando?
Por favor, links no, ya los vi a todo y cada vez entiendo menos! Gracias!!!!

Última edición por omdsetenta; 31/08/2013 a las 15:43
  #2 (permalink)  
Antiguo 31/08/2013, 16:01
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Seguridad en una consulta php mysql

1. Lee le manual de dichas funciones, ahí muchos ejemplos de uso
2. Leyendo el manual se resuelve esta inquietud
3. Ese código no es inseguro
4. Lee el manual
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 31/08/2013, 16:06
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Seguridad en una consulta php mysql

1. He leido el manual, los ejemplos son complejos
2. He leido el manual, los ejemplos son complejos
3. No entiendo como se si es seguro o no.
4. Los ejemplos de los manuales son complejos, por eso quisiera que me den algunos ejemplos sencillos por aqui. Gracias
  #4 (permalink)  
Antiguo 31/08/2013, 16:09
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Seguridad en una consulta php mysql

A ver, vamos por partes.

Independientemente del tema de "seguridad", ¿sabes lo que hacen las funciones que mencionas?

Eso lo debes tener claro, sin eso es imposible avanzar.

Si ya has leído el manual lo deberías saber.

¿Para qué sirven?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 31/08/2013, 16:21
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Seguridad en una consulta php mysql

A ver:
En este link:
http://php.net/manual/es/function.my...ape-string.php
Dice que se le añaden barras invertidas a una cadena de caracteres (por lo que entendi). Luego te ponen este ejemplo
Cita:

<?php
// Conexión
$enlace = mysql_connect('anfitrión_mysql', 'usuario_mysql', 'contraseña_mysql')
OR die(mysql_error());

// Consulta
$consulta = sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
mysql_real_escape_string($usuario),
mysql_real_escape_string($contraseña));
?>
Donde usan "sprintf" que no me interesa para nada, yo quiero una consulta normal mysql_query digamos.

Luego te ponen este ejemplo (que por cierto no tiene ninguna relacion con el anterior) y te dice que es un ejemplo de una consulta insegura. En ningun lado te dice como utilizar en forma normal (que es lo que ocurre en el 99% de las webs) sobre mysql-real-escape-string.

Cita:

<?php
// No hemos comprobado $_POST['password'], ¡podría ser cualquier cosa que el usuario quisiera! Por ejemplo:
$_POST['username'] = 'aidan';
$_POST['password'] = "' OR ''='";

// Consultar la base de datos para comprobar si existe algún usuario que coincida
$consulta = "SELECT * FROM users WHERE user='{$_POST['username']}' AND password='{$_POST['password']}'";
mysql_query($consulta);

// Esto significa que la consulta enviada a MySQL sería:
echo $consulta;
?>
No es por nada, pero me tuve que mudar de servidor porque me reventaron la base de datos MySQL y ahora logicamente quiero tener mas cuidado antes de subir todo.

Última edición por omdsetenta; 31/08/2013 a las 16:32
  #6 (permalink)  
Antiguo 31/08/2013, 16:40
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Seguridad en una consulta php mysql

Parece que ahora resulta que tengo que entender todo para preguntar sobre lo que no entiendo.
  #7 (permalink)  
Antiguo 31/08/2013, 16:44
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Seguridad en una consulta php mysql

Hola

Tratare de dar una explicación lo más simple posible.
Cada lenguaje tiene caracteres o comandos especiales, que cuando los usas, es interpretado como código ejecutable.
Por nuestro desconocimiento de lo anterior usamos esos caracteres, código ó no bloqueamos que un usuario ejecute algo que nosotros no deseamos, en ese caso, el programa hace algo completamente distinto a lo que nosotros queremos. Aquí es donde está la inseguridad, en que algún usuario que si conozca ese código interpretable o (vulnerabilidades), lo puede usar en nuestra contra.
Teniendo eso en mente, buscamos protegernos lo más posible.
Vamos al caso específico de lo que has planteado.

mysql_real_escape_string()
Los caracteres q escapa, son los que pueden ser utilizados para cambiar lo que nosotros queremos que realice la sentencia SQL

Entonces, filtramos los datos que nos envían, para tener certeza de que no nos estan enviado un código ejecutable y si lo fuese, hacemos que no sea interpretado como codigo ejecutable sino como un texto simple.
Así aumentamos nuestra certeza de que no nos perjudicaran.

Revisa esto
http://dev.mysql.com/doc/refman/5.0/...ng-syntax.html

Espero te sea de ayuda.
  #8 (permalink)  
Antiguo 31/08/2013, 16:55
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Seguridad en una consulta php mysql

Cita:
Iniciado por omdsetenta Ver Mensaje
Parece que ahora resulta que tengo que entender todo para preguntar sobre lo que no entiendo.
No, calma, primero debes entender el problema para poder entender la solución.

Si no sabes lo que es un ataque de SQL-injection, ¿entonces cómo esperas buscar una función que te ayude a protegerte de ello?

Lo digo por esto que nos comentas:
Cita:
Iniciado por omdsetenta Ver Mensaje
3. ¿Cómo podría proteger el siguiente código?
Código PHP:
$consulta_calorias_restantes=mysql_query("SELECT calorias_restantes FROM usuarios ORDER BY calorias_restantes ASC LIMIT 1",$Conexion); 
Y pues eso, dicho código no es inseguro por lo que se alcanza a leer, ¿para qué arreglar lo que no está roto?
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 31/08/2013, 16:56
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Seguridad en una consulta php mysql

Erick_MD9:
1) Estas mezclando chanchos con vacas. Yo conozco perfectamente lo que son caracteres especiales. No hablamos de eso, hablamos como puede una consulta ser hackeada y de como evitarlo.
2) Me envias a una pagina sobre mySQL, bases de datos que pueden ser consultadas en distintos lenguajes, cuando yo utilizo exclusivamente php.
3) No podrías poner un codigo inseguro y luego el mismo codigo, pero seguro usando ejemplos sencillos mysql_real_escape_string() o htmlentities() ? ¿Es mucho pedir?

pateketrueke: GOTO 3)
  #10 (permalink)  
Antiguo 31/08/2013, 17:08
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Seguridad en una consulta php mysql

Mi estimado omdsetenta, no confundo nada.
Tu problema es que no sabes de que te quieres proteger, ahí esta el problema, y te lo he tratado de explicar.
Una vez que descubras de que te quieres proteger, podrás hacerlo.
Suerte.
  #11 (permalink)  
Antiguo 31/08/2013, 17:10
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Seguridad en una consulta php mysql

3) No podrías poner un codigo inseguro y luego el mismo codigo, pero seguro usando ejemplos sencillos mysql_real_escape_string() o htmlentities() ? ¿Es mucho pedir?
  #12 (permalink)  
Antiguo 31/08/2013, 17:20
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Seguridad en una consulta php mysql

Ojo

INSEGURO

$a=$_POST[DATO];
SELECT * FROM TABLA1 WHERE ID=$a

MAS SEGURIDAD

$a=$_POST[DATO];
$a=mysql_real_escape_string($a);
SELECT * FROM TABLA1 WHERE ID=$a

LO QUE TIENES QUE BUSCAR ES ¿POR QUE?
SUERTE
  #13 (permalink)  
Antiguo 31/08/2013, 17:35
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Seguridad en una consulta php mysql

Le añades barras invertidas al valor de la variable que buscas en la base de datos, no entiendo como esto puede impedir un ataque, el agregado de las barras invertidas es aleatorio o tiene un patrón? Gracias
  #14 (permalink)  
Antiguo 31/08/2013, 17:40
 
Fecha de Ingreso: julio-2013
Ubicación: México
Mensajes: 361
Antigüedad: 10 años, 8 meses
Puntos: 55
Respuesta: Seguridad en una consulta php mysql

Cita:
Iniciado por Erick_MD9 Ver Mensaje
Mi estimado omdsetenta, no confundo nada.
Tu problema es que no sabes de que te quieres proteger, ahí esta el problema, y te lo he tratado de explicar.
Una vez que descubras de que te quieres proteger, podrás hacerlo.
Suerte.
Es un bucle sin fin.
  #15 (permalink)  
Antiguo 31/08/2013, 18:28
 
Fecha de Ingreso: febrero-2008
Mensajes: 109
Antigüedad: 16 años, 2 meses
Puntos: 4
Respuesta: Seguridad en una consulta php mysql

El 95% de las respuestas que necesitaba no me fueron dadas. Asi que igualmente agradezco. Al menos podrían haber explicado un poco mas, pero bueno, a otros les pasan los scripts completos y a mi se me niegan las mas simples de las explicaciones. Gracias de todos modos.
  #16 (permalink)  
Antiguo 31/08/2013, 18:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Seguridad en una consulta php mysql

Cita:
Iniciado por omdsetenta Ver Mensaje
Le añades barras invertidas al valor de la variable que buscas en la base de datos, no entiendo como esto puede impedir un ataque, el agregado de las barras invertidas es aleatorio o tiene un patrón? Gracias
Es un patrón, te explico:

Vamos a suponer que sabes algo de programación básica, sólo para explicarlo mejor, ¿sabes qué es un carácter especial?

Bien, en PHP un ejemplo de esto es el símbolo $ (dollar) que identifica a las variables en general, ahora, como ejemplo vamos a decir que necesitamos imprimir dicho carácter.

Código PHP:
// MAL
echo "$";

// BIEN
echo "\$";
echo 
'$'
¿Has notado la barra invertida?

Dicha barra indica que el siguiente carácter debe ser escapado, sencillamente para evitar su comportamiento habitual.

Bueno, pues en base de datos es exactamente lo mismo, en el lenguaje de SQL también hay caracteres especiales y debes tener cuidado cuando los utilizas.

En una consulta "a mano" es casi imposible que te hagas SQL-Injection tu mismo, ¿verdad? (uno nunca sabe )

Código PHP:
 $consulta_calorias_restantes=mysql_query("SELECT calorias_restantes FROM usuarios ORDER BY calorias_restantes ASC LIMIT 1",$Conexion); 
Ahí tu consulta no hace uso de ninguna variable proveniente del usuario, por lo tanto dicha cadena es segura sólo por el hecho de no es alterada con programación.

Código PHP:
 $consulta_calorias_restantes=mysql_query("SELECT calorias_restantes FROM usuarios ORDER BY $algun_orden ASC LIMIT 1",$Conexion); 
En este otro ejemplo ya se utiliza la variable $algun_orden que debería tener el nombre de la columna a ordenar, de tal manera que se pueda definir dinámicamente, inclusive desde la URL así: script.php?sort=tal_columna

Código PHP:
$algun_orden $_GET['sort']; 
¿Todo bien hasta ahí?

¿Qué podría hacer insegura dicha consulta?

Aquí hay una muy buena explicación: http://es.wikipedia.org/wiki/Inyecci%C3%B3n_SQL

Cita:
Iniciado por omdsetenta Ver Mensaje
El 95% de las respuestas que necesitaba no me fueron dadas. Asi que igualmente agradezco. Al menos podrían haber explicado un poco mas, pero bueno, a otros les pasan los scripts completos y a mi se me niegan las mas simples de las explicaciones. Gracias de todos modos.
No te confundas, tu problema no es objetivo, es teórico y se puede resolver estudiando y leyendo.

¿O cómo crees que aprendimos algunos?

¿Haciendo preguntas en los foros?

¿Cuando no había foros?

No, hoy la tienes fácil para aprender todo lo que quieras, en Internet está todo bien documentado.

Si tuvieras un problema en concreto te prestaríamos ayuda, pero no somos educadores así que no esperes más.

Cuando entiendas exactamente de qué te quieres proteger podemos seguir conversando, mientras eso no suceda no sirve continuar.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.

Etiquetas: html, mysql, seguridad, select, sql, usuarios
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 10:06.