Foros del Web » Programando para Internet » PHP »

Mejorar la seguridad de inyecciones SQL a sistema de registro

Estas en el tema de Mejorar la seguridad de inyecciones SQL a sistema de registro en el foro de PHP en Foros del Web. Estoy desarrollando un sistema de registro de usuarios para un proyecto que tengo en mente. Si bien no voy a poseer datos muy importantes como ...
  #1 (permalink)  
Antiguo 02/02/2013, 11:51
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 2 meses
Puntos: 2
Mejorar la seguridad de inyecciones SQL a sistema de registro

Estoy desarrollando un sistema de registro de usuarios para un proyecto que tengo en mente. Si bien no voy a poseer datos muy importantes como para decir que debo resguardarlos al 100% quiero que mi sistema sea lo mas seguro posible para tambien poder utilizarlo en un futuro para otras cosas..
He leido sobre las inyecciones SQL y se que puedo evitarlas un poco utilizando mysqli_real_escape_string pero queria saber que mas puedo aplicar para que sea super seguro?
Mi codigo es este:
Código PHP:
Ver original
  1. <?php
  2. require_once('config.php');
  3.  
  4. $username = mysqli_real_escape_string($conexion,$_POST['username']);
  5. $password = mysqli_real_escape_string($conexion,$_POST['password']);
  6.  
  7. if(isset($_POST['ingresar'])) {
  8. $query = mysqli_query($conexion,"SELECT * FROM usuarios WHERE nick='".$username."' and pass='".($password)."'");
  9.  
  10. if(mysqli_num_rows($query) > 0){
  11.  
  12.         $datos = mysqli_fetch_assoc($query);
  13.         $_SESSION['nivel'] = $datos['nivel'];
  14.         $_SESSION['usuario'] = $datos['nick'];
  15.         echo '<script language="JavaScript">window.location.href = "index.php";</script>';
  16.      
  17. } else {
  18.      echo 'Usuario y contraseña incorrectos';
  19.      echo '<script language="JavaScript">window.location.href = "index.html";</script>';
  20.        }
  21. }
  22.  
  23. ?>

Muchas gracias.
  #2 (permalink)  
Antiguo 02/02/2013, 11:57
 
Fecha de Ingreso: abril-2008
Ubicación: El Salvador
Mensajes: 736
Antigüedad: 16 años
Puntos: 47
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

te recomendaría que las claves las tengas encriptadas por algún método, ya sea md5 o con alguna función propia, personalmente me las claves las guardo con encriptación md5 pero antes generar una cadena cruzando el usuario y la clave...
  #3 (permalink)  
Antiguo 02/02/2013, 11:59
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

verifica que el user y la contraseña sea alfanumerica.

http://php.net/manual/es/function.ctype-alnum.php
  #4 (permalink)  
Antiguo 02/02/2013, 11:59
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Cita:
Iniciado por alex1084 Ver Mensaje
te recomendaría que las claves las tengas encriptadas por algún método, ya sea md5 o con alguna función propia, personalmente me las claves las guardo con encriptación md5 pero antes generar una cadena cruzando el usuario y la clave...
Esto que seguridad proporciona? Digamos, de que me sirve.
Mas o menos comprendo de encriptar en md5.. Osea se que desde la base de datos entonces no podre saber las password de todos lo cual es genial.
  #5 (permalink)  
Antiguo 02/02/2013, 12:00
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

en este hilo en el ultimos post he puesto funciones para encriptar la pass no uses md5 y tal ... http://www.forosdelweb.com/f18/seguridad-web-1004102/

Cita:
Iniciado por GonzaFY Ver Mensaje
Esto que seguridad proporciona? Digamos, de que me sirve.
Mas o menos comprendo de encriptar en md5.. Osea se que desde la base de datos entonces no podre saber las password de todos lo cual es genial.
ni tu ni nadie que entre en tu sistema

- y que la password tenga minimo 10 caracteres mayusculas minusculas y numeros
- consultas preparadas http://php.net/manual/en/mysqli.prepare.php

Última edición por webankenovi; 02/02/2013 a las 12:07
  #6 (permalink)  
Antiguo 02/02/2013, 12:11
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Cita:
Iniciado por webankenovi Ver Mensaje
en este hilo en el ultimos post he puesto funciones para encriptar la pass no uses md5 y tal ... [url]http://www.forosdelweb.com/f18/seguridad-web-1004102/[/url]



ni tu ni nadie que entre en tu sistema

- y que la password tenga minimo 10 caracteres mayusculas minusculas y numeros
De todas formas sere yo quien le asigne contraseñas a los usuarios pero esta bien porque si un ajeno entra a la base de datos me las puede robar.

Y hace un rato habia leido tu post pero tampoco soy experto en este tema y me confundo un poco con tantas cosas..

Bueno aparte de que me falta encriptar la contraseña a md5 logre esto:
Código PHP:
Ver original
  1. <?php
  2. require_once('config.php');
  3.  
  4. $username = mysqli_real_escape_string($conexion,$_POST['username']);
  5. $password = mysqli_real_escape_string($conexion,$_POST['password']);
  6.  
  7. if(isset($_POST['ingresar']))
  8. {
  9.     if(ctype_alnum($username) && ctype_alnum($password))
  10.     {
  11.         $query = mysqli_query($conexion,"SELECT * FROM usuarios WHERE nick='".$username."' and pass='".($password)."'");
  12.  
  13.         if(mysqli_num_rows($query) > 0)
  14.         {
  15.  
  16.             $datos = mysqli_fetch_assoc($query);
  17.             $_SESSION['nivel'] = $datos['nivel'];
  18.             $_SESSION['usuario'] = $datos['nick'];
  19.             echo '<script language="JavaScript">window.location.href = "index.php";</script>';
  20.         }
  21.         else
  22.         {
  23.             echo 'Usuario y contraseña incorrectos';
  24.             echo '<script language="JavaScript">window.location.href = "index.html";</script>';
  25.         }
  26.     }
  27.     else
  28.     {
  29.     echo 'Ingresa un usuario y contraseña validos';
  30.    
  31.     }
  32. }
  33.  
  34. ?>

Supongo que con eso el atacante ya no podra ingresar nada fuera de lugar a los campos.

Y mi duda de lo que lei en tu post de que sirve proteger las carpetas .htacces?

Gracias a todos, son muy amables =).


Edito:
Encontre este codigo en una pagina pero no se si ya es muy exagerado o si es que esta de mas..
Código PHP:
Ver original
  1. <?php
  2. /**
  3.  * SEGURIDAD PARA SQL INJECTION
  4.  */
  5. global $errorSQLinjection;
  6. $GLOBALS['errorSQLinjection'] = "../index.php";
  7. function _clean($var)
  8. {
  9.     if(is_array($var)) return $var;
  10.     //print_r($var);
  11.     $pattern = array("/0x27/","/%0a/","/%0A/","/%0d/","/%0D/","/0x3a/","/ select /i","/insert/i",
  12.                      "/from/i","/concat/i","/delete/i","/truncate/i","/alter /i",
  13.                      "/information_schema/i","/unhex/i","/load_file/i","/outfile/i","/0xbf27/");
  14.     $value = preg_replace($pattern, "", $var);
  15.     foreach($pattern as $patt)
  16.         if(preg_match($patt, $var))
  17.         {
  18.             header('Location: '.$GLOBALS['errorSQLinjection']);
  19.         }
  20.     return $value;
  21. }
  22.  
  23. if(isset($_GET))
  24. {
  25.     foreach($_GET as $k => $v)
  26.     {
  27.         $_GET[$k] = _clean($v);
  28.     }
  29. }
  30. if(isset($_POST))
  31. {
  32.    
  33.     foreach($_POST as $k => $v)
  34.     {
  35.         $_POST[$k] = _clean($v);
  36.     }
  37. }
  38. /**
  39.  *
  40.  */
  41. ?>

Última edición por GonzaFY; 02/02/2013 a las 12:17
  #7 (permalink)  
Antiguo 02/02/2013, 12:24
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

no podra ingresar nada que no sea alfanumerico solo letras y numeros , tambien a la hora del registro deberas verificar lo mismo que sea alfanumerico y avisar que solo puede contener useranme y password letras y numeros , si deseas que puedan insertar otros caracteres deberas verificarlo.

te lo he tocado un poco a ver que te parece

Código PHP:
Ver original
  1. <?php
  2.     session_start();
  3.     require_once('config.php');
  4.  
  5.     if(isset($_POST['ingresar']) and isset($_POST['username'] and isset($_POST['password']))
  6.     {
  7.         if(ctype_alnum($_POST['username']) and ctype_alnum($_POST['password']))
  8.         {
  9.             $username = mysqli_real_escape_string($_POST['username']); // no tendria mucho efecto pero aun asi lo dejo
  10.             $password = mysqli_real_escape_string($_POST['password']); // no tendria mucho efecto pero aun asi lo dejo
  11.            
  12.             $query    = mysqli_query($conexion,"SELECT * FROM usuarios WHERE nick='".$username."' and pass='".$password."'");
  13.      
  14.             if(mysqli_num_rows($query) > 0)
  15.             {
  16.      
  17.                 $datos = mysqli_fetch_assoc($query);
  18.                 $_SESSION['nivel'] = $datos['nivel'];
  19.                 $_SESSION['usuario'] = $datos['nick'];
  20.                 echo '<script language="JavaScript">window.location.href = "index.php";</script>';
  21.             }
  22.             else
  23.             {
  24.                 echo 'Usuario y contraseña incorrectos';
  25.                 echo '<script language="JavaScript">window.location.href = "index.html";</script>';
  26.             }
  27.         }
  28.         else
  29.         {
  30.         echo 'Ingresa un usuario y contraseña validos';
  31.        
  32.         }
  33.     }
  34.      
  35.     ?>

ahora solo te faltaria hasear las pass y en el registro especificar que sea mayor de 10 caracteres para aumentar la seguridad de la contraseña , y preparar la consulta y yo creo que estaria muy seguro

respecto a .htaccess y directorios , yo no se tu estructura pero a lo que se refiere es a una estructura mas o menos asi

index.php
dir / sistema
dir/ public

restringimos el acceso a sistema y a todos sus directorios que no sean accesible desde la url , en sistema tendriamos todos los scripts controladores ,clases funciones etc....y en public todo el contenido publico , asi separamos el sistema de la aplicacion, y la aplicacion se conecta con el sistema para usar sus funciones

Última edición por webankenovi; 02/02/2013 a las 12:31
  #8 (permalink)  
Antiguo 02/02/2013, 12:32
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Muy bueno como dejaste el codigo, quitare $password y $username luego ya que por ahora como estoy trabajando mucho sobre login.php me deja mas facil de entender..

Y mas o menos entiendo lo que dices del .htaccess. Pero me quedo algo confundido..
¿Podrias explicarme un poquito mejor de como trabajar con algo asi? Es decir yo en sistema guardo mi config, el login y esas cosas pero luego como utilizo desde las paginas de "public"...
Y como se restringe el acceso a la carpeta sistema? O es solo una forma de decir?

Muchas gracias, encerio :D
  #9 (permalink)  
Antiguo 02/02/2013, 12:41
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

para denegar el acceso crea un archivo .htaccess con el siguiente contenido Deny from all y ahora prueba aacceder desde la url veras que no tienes acceso , ahora crea un index fuera de ese directorio

index.php / dir protegido /

y en el index haz un include hacia un archivo de ese directorio y veras que si es accesible

ahora en protegido guardamos el login y todo lo que tengas ,.

entramos en miweb.com/public/login.php y este no contendra las funciones tan solo las llamadas a login.php del sistema y tambien contendra el html

es tan solo un ejemplo existen muchas estructuras , yo uso una basada en el index , solo se accede desde el index a todo el sistema y usa request para pasar controladores parametros etc. por la url miweb.com/controlador/modelo/vista algo asi y el index se encargaria de todo , digamos que welcome es un controlador la url quedaria asi miweb.com/welcome y se conectaria con ese controlador que ya es el encatgado de administrar la pagina , te recomiEndo echar un vistazo a MVC
  #10 (permalink)  
Antiguo 02/02/2013, 12:53
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Disculpa mi ignorancia pero como hago el archivo .htaccess...
Es decir hice uno .htaccess.txt (porque sino me dice que ponga nombre) y le puse deny for all y perfecto no puedo entrar a ese archivo pero si puedo ingresar a un documento de texto que esta en la misma carpeta..
Me parece interesante usar esto ya que muchos sistemas lo hacen y ademas deja todo mucho mas ordenado..

// Es porque intento cargarlo en el localhost, lei que en servidores si funciona asi que luego me creo una cuenta en algun host para probar.

Y aparte de todo esto mira, para agregar el md5 modifique el $query y quedo asi:
Código PHP:
Ver original
  1. $query = mysqli_query($conexion,"SELECT * FROM usuarios WHERE nick='".$_POST['username']."' and pass='".md5($_POST['password'])."'");

Y elimine los mysqli_real_escape_string, no falta nada mas cierto? Digo, ya que con decir que solo se puede utilizar caracteres alfanumericos estoy bloqueando cualquier tipo de signo raro

Edito:
Agrego una ultima cosa:
Los rangos de cada usuario debo utilizarlos en la mayoria de las paginas, asi como su nombre. Es conveniente guardar la $_SESSION['nick'] en el config y asi, si la declaro por ejemplo $nick = $_SESSION['nick']; poder utilizarla en todos lados, o me conviene realizar esto en cada pagina?

Son todas mis dudas :D!

Última edición por GonzaFY; 02/02/2013 a las 13:08
  #11 (permalink)  
Antiguo 02/02/2013, 13:12
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Cita:
Iniciado por GonzaFY Ver Mensaje
Y elimine los mysqli_real_escape_string, no falta nada mas cierto? Digo, ya que con decir que solo se puede utilizar caracteres alfanumericos estoy bloqueando cualquier tipo de signo raro
puedes verificar el tipo que sea un string ' is_string() ' , si la funcion cumple con su cometido efectivamente solo dejarias pasar numeros y letras , aunque puedes probar ejemplos intenta meter caracteres raros comillas ejemplos de sql injection etc...

Cita:
Iniciado por GonzaFY Ver Mensaje
Disculpa mi ignorancia pero como hago el archivo .htaccess...
Es decir hice uno .htaccess.txt (porque sino me dice que ponga nombre) y le puse deny for all y perfecto no puedo entrar a ese archivo pero si puedo ingresar a un documento de texto que esta en la misma carpeta..
ese .txt no es valido , yo tengo el problema que tu tienes en mi maquina no me deja crearlos y he probado muchas cosas y nada , me baje uno que viene en codegniter y ya con ese lo copio y listo , no me acuerdo por que era el problema de crear un .htaccess


respecto a la contraseña no uses md5 como ya te dije es bastante vulnerable , ademas usa un salt

ejemplo

esto deberia de ir en el registro

$pass = crypt($_POST['password'],'salt una clave'); y la guardamos en la bd y la misma forma para en el login para comprobar en la query
Código PHP:
Ver original
  1. $pass = crypt($_POST['password'],'salt una clave');
  2.  
  3. $query = mysqli_query($conexion,"SELECT * FROM usuarios WHERE nick='".$_POST['username']."' and pass='".$pass."'");

ambos salt el del registro y el del login deben de coincidir

--------------

respecto a las sessiones , de la manera que tu dices estan creando mas variables y por lo tanto consumes mas memoria.

la session la puedes usar en cualquier parte sin necesidad de crear otro variable

echo $_SESSION['NICK'];

Última edición por webankenovi; 02/02/2013 a las 13:17
  #12 (permalink)  
Antiguo 02/02/2013, 13:29
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Tienes mucha razon, utilizar session no es tan complejo como para que haga falta crear otra variable, yo y mis vueltas xd.

Que es salt una clave?
Fui a la pagina donde explica crypt pero no entiendo eso..

Y por ultimo, crei que md5 era MUY SEGURO..
  #13 (permalink)  
Antiguo 02/02/2013, 13:34
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

el salt digamos que es una clave que tu proporciones para que se genere el hash

string+salt = hash

un salt puede ser cualquier cosa

salt = 'hola amigo esta es mi clave secreta'
salt = 'KIJHUIHUIH(/&/TAyutuydgsuf8df7s98fdyu89sfud98sfud98f7s9f87f97fs8 '

si generamos 2 hash con diferentes salt y el mismo string no coincidiran ,el salt hizo que el hash fuera diferente , para comparar hash el salt debe de ser el mismo
  #14 (permalink)  
Antiguo 02/02/2013, 13:41
 
Fecha de Ingreso: febrero-2013
Mensajes: 33
Antigüedad: 11 años, 2 meses
Puntos: 2
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Ah ahora comprendo, yo crei que habian codigos especificos.
Es algo asi como si fuera que combina el string al salt..

Me quedo todo super clarisimo y creo que ahora todo es mas seguro..

Muchisimas gracias por la gran ayuda =).
  #15 (permalink)  
Antiguo 02/02/2013, 13:43
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

de nada , me alegro que te quedara claro y entiendas los conceptos , saludos


Última edición por webankenovi; 02/02/2013 a las 13:49
  #16 (permalink)  
Antiguo 02/02/2013, 17:30
Avatar de Sirius381  
Fecha de Ingreso: abril-2006
Mensajes: 129
Antigüedad: 18 años
Puntos: 12
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

Me han ayudado mucho los dos, gracias!
__________________
Don Ramón Fan
  #17 (permalink)  
Antiguo 02/02/2013, 18:41
webankenovi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Mejorar la seguridad de inyecciones SQL a sistema de registro

me alegro

Etiquetas: html, inyecciones, mejorar, mysql, registro, seguridad, select, sistema, 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




La zona horaria es GMT -6. Ahora son las 12:08.