Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] como prevenir esta inyección 'or '1'='1

Estas en el tema de como prevenir esta inyección 'or '1'='1 en el foro de PHP en Foros del Web. hola como le conté estoy empesando en esto de php y mysql y encontré un video para hacer un login sencillo y resulta que luego ...
  #1 (permalink)  
Antiguo 04/03/2016, 21:50
 
Fecha de Ingreso: diciembre-2015
Mensajes: 369
Antigüedad: 8 años, 10 meses
Puntos: 4
como prevenir esta inyección 'or '1'='1

hola como le conté estoy empesando en esto de php y mysql y encontré un video para hacer un login sencillo y resulta que luego lo pruebo con esta simple inyeccion y resulto que la inyección paso muy fácil.
Me gustaría saber como puedo protejer mi código de esta inyección gracias.

este es el código de my practica

Código HTML:
Ver original
  1. form action="proceso.php" method="POST">
  2.    
  3.     Nombre: <input type="text" name="usuario" value="" placeholder="usuario....."><br>
  4.    
  5.     Pass: <input type="text" name="contrasena" value="" placeholder="Contrasena..."><br>
  6.     <input type="submit" value"aceptar" /></form><br>
  7. </form>

PHP

Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. $usuario = $_POST['usuario'];
  5. $contrasena = $_POST['contrasena'];
  6.  
  7. include("conexion.php");
  8.  
  9. $proceso =  mysqli_query($conexion,"SELECT * FROM usuarios WHERE usuario='$usuario' AND contrasena='$contrasena'");
  10.  
  11. //$proceso = $conexion->query("SELECT * FROM usuarios WHERE usuario='$usuario' AND contrasena='$contrasena'"); //$mysqli->query () dice que mysql ejecute el query
  12.  
  13.     if($resultado = mysqli_fetch_array($proceso))
  14.     {
  15.         $_SESSION['u_usuario'] = $usuario;
  16.         header("location: sesion.php");
  17.        
  18.     }
  19.     else
  20.     {
  21.         echo "calve erronea" ;
  22.     }
  23.  
  24. ?>
  #2 (permalink)  
Antiguo 04/03/2016, 22:21
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: como prevenir esta inyección 'or '1'='1

Como primera medida, ponle el terminador de sentencia a la query en MySQL. Es el punto y coma (; ).
De ese modo cualquier cosa que le agreguen a la query quedará fuera de ella y disparará un error de sintaxis.

Luego, si quieres seguridad, No hagas consultas directas. Usa Stored Procedures, que son invulnerable al sql-injection.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 05/03/2016, 02:22
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: como prevenir esta inyección 'or '1'='1

Puedes escapar los datos recibidos antes de usarlos en tu sentencia con mysqli_real_escape_string
  #4 (permalink)  
Antiguo 05/03/2016, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: como prevenir esta inyección 'or '1'='1

Yo te sugeriría mejor que vayas al manual de referencia de PHP, que tiene un capitulo especifico dedicado al tema...

Manual de PHP - Seguridad - Seguridad en bases de datos - Inyección de SQL

El articulo es largo, pero muy bien escrito.

Posdata: Solo escapar los datos recibidos no resuelve el problema. Esa función apunta a impedir que los datos insertados rompan la sintaxis de la SQL original, pero no evitará que haya sql-injection.

Cita:
mysqli::real_escape_string -- mysqli_real_escape_string — Escapa los caracteres especiales de una cadena para usarla en una sentencia SQL, tomando en cuenta el conjunto de caracteres actual de la conexión
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 05/03/2016, 13:54
 
Fecha de Ingreso: diciembre-2015
Mensajes: 369
Antigüedad: 8 años, 10 meses
Puntos: 4
Respuesta: como prevenir esta inyección 'or '1'='1

los ariculos son muy largos y no lo entiendo mucho, fuera bien que pusieran mi codigo protejido seria mas facil por fa
  #6 (permalink)  
Antiguo 05/03/2016, 14:24
 
Fecha de Ingreso: diciembre-2015
Mensajes: 529
Antigüedad: 8 años, 11 meses
Puntos: 39
Respuesta: como prevenir esta inyección 'or '1'='1

Un café no quisieras tambien?
El foro está para resolver dudas, no para que te hagan el código y listo, funcionando al 100. Siempre tenemos que esforzarnos en algún momento, si no de nada servirá. Sólo un consejo :D
  #7 (permalink)  
Antiguo 05/03/2016, 14:26
 
Fecha de Ingreso: noviembre-2003
Ubicación: Zaragoza, España
Mensajes: 1.257
Antigüedad: 21 años
Puntos: 154
Respuesta: como prevenir esta inyección 'or '1'='1

Cita:
Iniciado por wilson_romero Ver Mensaje
los ariculos son muy largos y no lo entiendo mucho, fuera bien que pusieran mi codigo protejido seria mas facil por fa
Hola wilson_romero,

Claro que los artículos son muy largos, pero todos los tenemos que leer para hacer lo que necesitamos, y claro que es más fácil si te lo damos hecho, pero este foro no funciona así, si necesitas que te den el código hecho, te recomiendo que publiques tus requerimientos en este foro, ya que aquí lo que se hace es ayudar, que no es lo mismo que hacer el trabajo de los demás por la cara.
  #8 (permalink)  
Antiguo 05/03/2016, 15:56
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: como prevenir esta inyección 'or '1'='1

Cita:
Iniciado por wilson_romero Ver Mensaje
los ariculos son muy largos y no lo entiendo mucho, fuera bien que pusieran mi codigo protejido seria mas facil por fa
El libro de "Fundamentos de las Bases de Datos" de Silberschatz tiene más de 900 páginas... Y tienes que aprender al menos el 80% de lo que allí se expone para aprobar BBDD, y es sólo lo general. Seguridad en BBDD es toda una especialidad.

¿En serio una pagina web resumida te parece demasiado?



Si quieres aprender, tienes que leer. Nadie puede aprender por ti.
Y para lograr que otros hagan tu trabajo, tendrías que pagar...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 05/03/2016 a las 18:50
  #9 (permalink)  
Antiguo 05/03/2016, 21:34
 
Fecha de Ingreso: diciembre-2015
Mensajes: 369
Antigüedad: 8 años, 10 meses
Puntos: 4
Respuesta: como prevenir esta inyección 'or '1'='1

voy a leer pero no entiendo mucho de eso vamos a ver que al.
  #10 (permalink)  
Antiguo 05/03/2016, 22:26
 
Fecha de Ingreso: diciembre-2015
Mensajes: 369
Antigüedad: 8 años, 10 meses
Puntos: 4
Respuesta: como prevenir esta inyección 'or '1'='1

lo ley y no entiendo
  #11 (permalink)  
Antiguo 05/03/2016, 22:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: como prevenir esta inyección 'or '1'='1

No entiendes qué?
Trata de ser concreto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #12 (permalink)  
Antiguo 05/03/2016, 23:16
 
Fecha de Ingreso: diciembre-2015
Mensajes: 369
Antigüedad: 8 años, 10 meses
Puntos: 4
Respuesta: como prevenir esta inyección 'or '1'='1

gnzsoloyoya puede entender lo que me decias lo encontre en esta web es que no me dijit donde poner el codigo y de verdad yo no entiende ese manual los ejemplos super raros no lo entiendo de verdad y me dices que tampoco esto no es muy seguro que no esta seguro de ataques.
Como te proteges tu ya que esto que se le agrega al codigo no estan seguro como es mejor me gustaria saber tieen alguan web que no sea en china para mi ;) :P : )

ESTE ES EL CÓDIGO SI ALGUIEN LO NECESITA
agregar en la petition (consulta msql) de esta froma con mysql_real_escape_string

Código PHP:
Ver original
  1. $proceso =  mysqli_query($conexion, "SELECT * FROM usuarios WHERE usuario='".mysql_real_escape_string($usuario)."' AND contrasena='".mysql_real_escape_string($contrasena)."'");


Código PHP:
Ver original
  1. <?php
  2.  
  3.  
  4. $usuario = $_POST['usuario'];
  5. $contrasena = $_POST['contrasena'];
  6.  
  7. include("conexion.php");
  8.  
  9. $proceso =  mysqli_query($conexion, "SELECT * FROM usuarios WHERE usuario='".mysql_real_escape_string($usuario)."' AND contrasena='".mysql_real_escape_string($contrasena)."'");
  10.  
  11. //$proceso = $conexion->query("SELECT * FROM usuarios WHERE usuario='$usuario' AND contrasena='$contrasena'"); //$mysqli->query () dice que mysql ejecute el query
  12.  
  13.     if($resultado = mysqli_fetch_array($proceso))
  14.     {
  15.         $_SESSION['u_usuario'] = $usuario;
  16.         header("location: sesion.php");
  17.        
  18.     }
  19.     else
  20.     {
  21.         echo "calve erronea" ;
  22.     }
  23.  
  24. ?

Última edición por wilson_romero; 05/03/2016 a las 23:28
  #13 (permalink)  
Antiguo 07/03/2016, 04:36
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 14 años, 1 mes
Puntos: 123
Respuesta: como prevenir esta inyección 'or '1'='1

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Yo te sugeriría mejor que vayas al manual de referencia de PHP, que tiene un capitulo especifico dedicado al tema...

Manual de PHP - Seguridad - Seguridad en bases de datos - Inyección de SQL

El articulo es largo, pero muy bien escrito. Pero...

Posdata: Solo escapar los datos recibidos no resuelve el problema. Esa función apunta a impedir que los datos insertados rompan la sintaxis de la SQL original, pero no evitará que haya sql-injection.
Entiendo que antes de hacer una consulta a la base, se deben validar y escapar adecuadamente los datos.

Según el manual una injeccion sql es una técnica donde un atacante crea o altera comandos SQL existentes para exponer datos.

Si como tu mismo indicas mysqli_real_escape_string impide que se rompa la sintaxis sql, pude ser suficiente (pienso). Es verdad que para prevenir el mismo manual nos indica que se establezca el conjunto de caracteres de la conexión ya que se utilizará este conjunto de caracteres para escapar la cadena. Pero esto en si mismo entiendo que hace más robusta la función, ya que se escapan los datos con el juego de caracteres de la bd.

En el manual también encontramos
Cita:
Esta función siempre debe usarse (con pocas excepciones) para hacer seguros los datos antes de enviar una consulta a MySQL.]Esta función siempre debe usarse (con pocas excepciones) para hacer seguros los datos antes de enviar una consulta a MySQL.
He buscado sobre como hacer injeccion cuadro se utiliza mysqli_real_escape_string, pero no e logrado encontrar nada, con esto no pretendo decir que sea imposible.

Mi cuestión es ¿ por qué es inseguro usar solamente mysqli_real_escape_string ? ¿ o en que aspecto puede ser vulnerable una sentencia en la que se escapan los tados con mysqli_real_escape_string ?

Gracias, por la ilustración maestro.
  #14 (permalink)  
Antiguo 07/03/2016, 22:36
 
Fecha de Ingreso: diciembre-2015
Mensajes: 369
Antigüedad: 8 años, 10 meses
Puntos: 4
Respuesta: como prevenir esta inyección 'or '1'='1

Buena pregunta xerifandtomas

Etiquetas: 1-1, inyección, mysql, prevenir, select, 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




La zona horaria es GMT -6. Ahora son las 15:04.