Foros del Web » Programando para Internet » PHP »

alguien que me de Sugerencias para evitar mysql injection!?

Estas en el tema de alguien que me de Sugerencias para evitar mysql injection!? en el foro de PHP en Foros del Web. Hola buenas! =) tengo una pagina con login de usuario bueno son varios los form que uso con metodo post para meter datos en la ...
  #1 (permalink)  
Antiguo 22/03/2010, 15:48
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
alguien que me de Sugerencias para evitar mysql injection!?

Hola buenas! =) tengo una pagina con login de usuario bueno son varios los form que uso con metodo post para meter datos en la base..

quisiera que me pudieran ayudar, decir, que cosas le podria poner al codigo para evitar mysql injection.. porfaa alguien..?

Código PHP:
<?php
// Configura los datos de tu cuenta
session_start();    
include (
'../seg/conexion.php'); 

if (
$_POST['nombre']) {
//Comprobacion del envio del nombre de usuario y password
$nombre=$_POST['nombre'];
$password=$_POST['password'];

$checknombre mysql_query("SELECT nombre FROM usuarios WHERE nombre='$nombre'");
$nombre_exist mysql_num_rows($checknombre);
if (
$nombre_exist>0) {
$consulta=mysql_query("SELECT estado FROM usuarios WHERE nombre='$nombre'");
    
$lado=mysql_num_rows ($consulta);
while(
$row=mysql_fetch_array($consulta)){
$estado=$row["estado"];
$consulta2=mysql_query("SELECT comprobado FROM usuarios WHERE nombre='$nombre'");
    
$lado2=mysql_num_rows ($consulta2);
while(
$row=mysql_fetch_array($consulta2)){
$comprobado=$row["comprobado"];

if (
$password==NULL) {
echo 
"<script type=\"text/javascript\">alert(\"Error: La clave no fue enviada! intentalo de nuevo.'\");window.close();</script>";  
}else{
$query mysql_query("SELECT nombre,pass FROM usuarios WHERE nombre = '$nombre'") or die(mysql_error());
$data mysql_fetch_array($query);
if(
$data['pass'] != $password) {
echo 
"<script type=\"text/javascript\">alert(\"Login Incorrecto\"); 
  window.close();</script>"
;
  }else{
    if(
$estado!=0) {
    echo 
"<script type=\"text/javascript\">alert(\"Tu Cuenta ha sido Suspendida'\");window.close();</script>";  
}else{
if(
$comprobado==0) {
    echo 
"<script type=\"text/javascript\">alert(\"No Haz Validado Tu Cuenta, Revisa tu Bandeja de correo Electrónico, Recuerda revisar Correo no deseado Si borraste el correo de Validación dirígete a 'Validar mi Cuenta' y se te enviará un correo de nuevo.'\");window.close();</script>";  
    }else{
$query mysql_query("SELECT nombre,pass,id FROM usuarios WHERE nombre = '$nombre'") or die(mysql_error());
$row mysql_fetch_array($query);
$_SESSION["s_nombre"] = $row['nombre'];
$_SESSION["s_id"] = $row['id'];
header("Location: cuenta.html");
}
}
}
}
}
}
}else{ 
echo 
"<script type=\"text/javascript\">alert(\"Login Incorrecto.\"); window.close();</script>";}
}
?>
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #2 (permalink)  
Antiguo 22/03/2010, 15:52
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

bueno tienes varias funciones para proteger tus consultas y todas bastante nombradas

mysql_real_escape_string()
sprintf()
htmlentities()
stripslashes()

saludos!
__________________
More about me...
~ @rhyudek1
~ Github
  #3 (permalink)  
Antiguo 22/03/2010, 15:55
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

buenas una forma de implementarlo como seria .. cual de todas tendria q implementar ... alguna de esas hace la misma cosa? :S
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #4 (permalink)  
Antiguo 22/03/2010, 15:56
Avatar de spider_boy  
Fecha de Ingreso: diciembre-2003
Ubicación: Chile
Mensajes: 1.855
Antigüedad: 20 años, 4 meses
Puntos: 89
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

http://www.google.cl/#hl=es&source=h...b9a1418f739fed
__________________
Nunca te olvidaré mi negra hermosa. Te extraño demasiado.
  #5 (permalink)  
Antiguo 22/03/2010, 17:20
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

e puesto esto asi :
Código PHP:
$query =sprintf("SELECT pass FROM usuarios WHERE nombre = '%s'",
mysql_real_escape_string($nombre))or die(mysql_error()); 
y me dice error en la linea 29 que es la que esta debajo de ella..



Linea 29: $data = mysql_fetch_array($query);
if($data['pass'] != $password) {echo ................................


:S como lo tendria que poner.. ? a la variable password que la agarro por post le coloque esto: $password=stripslashes($_POST['password']);
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #6 (permalink)  
Antiguo 22/03/2010, 17:37
 
Fecha de Ingreso: septiembre-2005
Mensajes: 34
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Esta utilizando mal la funcion. La misma no ejecuta el query, solo escapa los caracteres y las sentencias que podría terminar en un SQL Injection.
Tendrías que hacerlo de esta forma:
Código PHP:
Ver original
  1. $query = mysql_real_escape_string("SELECT pass FROM usuarios WHERE nombre = $nombre");
  2. $response = mysql_ query($query, $link); // Donde $link es el resouce de tu conexion a un servidor MySQL
  3. mysql_fetch_array($response);
  4. // ... resto del codigo ...

Espero te haya servido
  #7 (permalink)  
Antiguo 22/03/2010, 17:49
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

mm bueno Gracias! =) y ya solo con eso.. estaria protegido? la parte de link .. no la coloco pro q ya yo establesco al conexion con un include.. =) ! voy a probarlo.. ahora mismo..

ya lo eh probado lo coloque asi:
Código PHP:
if ($password==NULL) {
echo 
"<script type=\"text/javascript\">alert(\"Error: La clave no fue enviada! intentalo de nuevo.'\");window.close();</script>";  
}else{
$query mysql_real_escape_string("SELECT pass FROM usuarios WHERE nombre = $nombre");
$response mysql_query($query); // Donde $link es el resouce de tu conexion a un servidor MySQL
mysql_fetch_array($response);          
$data mysql_fetch_array($query);
if(
$data['pass'] != $password) {
echo 
"<script type=\"text/javascript\">alert(\"Login Incorrecto\"); 
  window.close();</script>"
;
  }else{ ...............................



mas  codigo................ 
y me sale error en mysql_fetch_array($response); justamente en esa linea.. =(
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #8 (permalink)  
Antiguo 22/03/2010, 17:55
 
Fecha de Ingreso: septiembre-2005
Mensajes: 34
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Código PHP:
Ver original
  1. mysql_fetch_array($response);          
  2. $data = mysql_fetch_array($query);  // Error

Esto es lo que haces mal. Le tenés que pasar como argumento la variable $response, que es el resouce MySQL que devolvió la consulta y no $query que es el string que contiene qué es lo que debe consultar el motor.

Tenés que hacerlo así:
Código PHP:
Ver original
  1. $response = mysql_query($query);      
  2. // Le pasamos el resource que nos devuelve mysql_query();
  3. $data = mysql_fetch_array($response);
  4. if($data['pass'] != $password) {
  5.  
  6. [....]

Para más información consulta el manual de PHP que está en castellano.
Saludos
  #9 (permalink)  
Antiguo 22/03/2010, 18:02
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

eso ya lo habia intentado.. =( por q me imagine q era asi y lo coloque pero me da error en el

$data = mysql_fetch_array($response);

not valid argument resource... :S por que sera .. ? =(
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #10 (permalink)  
Antiguo 22/03/2010, 18:10
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Seguramente la consulta esta arrojando un error:

$response = mysql_query($query) or die('Error en la consulta: ' . mysql_error());

Por otra parte, no es conveniente escapar toda la consulta, sino los datos por separado y encerrando los datos de cadena (char, varchar, text, etc.) entre comillas simples:
Código SQL:
Ver original
  1. $nombre = mysql_real_escape_string($nombre);
  2. $query = "SELECT * FROM tabla WHERE nombre = '$nombre'";

Si escapas la consulta, '$nombre' quedaria tal vez como \'Juan Perez\', provocando un error al ejecutarla.
__________________
- León, Guanajuato
- GV-Foto
  #11 (permalink)  
Antiguo 22/03/2010, 18:17
 
Fecha de Ingreso: septiembre-2005
Mensajes: 34
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Porque no está ejecutando la consulta. El error está en mysql_query();
Lo que dice es "El argumento no es un recurso válido", por lo que seguramente no estás haciendo adecuadamente la conexion a la base de datos y, por consiguiente, mysql_query() no devuelve un resource adecuado que pueda manejar mysql_fetch_array();

Tené en cuenta los siguiente:

1) Verificá que no estés cerrando la conexión en algún punto del script.
2) Siempre chequeá que la conexión se encuentre establecida luego de realizar la conexión.
Un IF es lo más adecuado si no poseés algun bloque try...catch que pueda manejar el error.

Te recomiendo leer la documentación ya que este error es muy simple de solucionar. No me molesta ayudarte, pero siempre la mejor ayuda es la documentación oficial. Existen muchos ejemplo y hay aportes realmente buenos de los colaboradores.
  #12 (permalink)  
Antiguo 22/03/2010, 18:23
 
Fecha de Ingreso: septiembre-2005
Mensajes: 34
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Porque no está ejecutando la consulta. El error está en mysql_query();
Lo que dice es "El argumento no es un recurso válido", por lo que seguramente no estás haciendo adecuadamente la conexion a la base de datos y, por consiguiente, mysql_query() no devuelve un resource adecuado que pueda manejar mysql_fetch_array();

Tené en cuenta los siguiente:

1) Verificá que no estés cerrando la conexión en algún punto del script.
2) Siempre chequeá que la conexión se encuentre establecida luego de realizar la conexión.
Un IF es lo más adecuado si no poseés algun bloque try...catch que pueda manejar el error.

Te recomiendo leer la documentación ya que este error es muy simple de solucionar. No me molesta ayudarte, pero siempre la mejor ayuda es la documentación oficial. Existen muchos ejemplo y hay aportes realmente buenos de los colaboradores.
  #13 (permalink)  
Antiguo 22/03/2010, 18:29
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

mm no te entendi men... ='( ...y.y
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #14 (permalink)  
Antiguo 22/03/2010, 18:41
 
Fecha de Ingreso: septiembre-2005
Mensajes: 34
Antigüedad: 18 años, 6 meses
Puntos: 1
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Claro, el tema es el siguiente:
mysql_fetch_array() te está dando error porque mysql_query() no esta devolviendo un resource válido. Esto puede darse por varios motivos:

1) No está establecida la conexion a la base de datos.
2) Existe un error en el query
3) El query no devuelve resultados

Te colocaría un ejemplo completo pero ya me estoy yendo de la oficina. Si alguien puede hacerlo sería genial, sino mañana mismo lo posteo yo.

Saludos !!
  #15 (permalink)  
Antiguo 22/03/2010, 19:25
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Lo eh acomodado ai y aun nada.. :S hay estan resaltado la conxion y la consulta. :S


Código PHP:
include ('../seg/conexion.php'); //AKIII ESTA LA CONEXION!! 
//Comprobacion del envio del nombre de usuario y password
$nombre=$_POST['nombre'];
$password=stripslashes($_POST['password']);

$checknombre mysql_query("SELECT nombre FROM usuarios WHERE nombre='$nombre'");
$nombre_exist mysql_num_rows($checknombre);
if (
$nombre_exist>0) {
$consulta=mysql_query("SELECT estado FROM usuarios WHERE nombre='$nombre'");
    
$lado=mysql_num_rows ($consulta);
while(
$row=mysql_fetch_array($consulta)){
$estado=$row["estado"];
$consulta2=mysql_query("SELECT comprobado FROM usuarios WHERE nombre='$nombre'");
    
$lado2=mysql_num_rows ($consulta2);
while(
$row=mysql_fetch_array($consulta2)){
$comprobado=$row["comprobado"];

if (
$password==NULL) {
echo 
"<script type=\"text/javascript\">alert(\"Error: La clave no fue enviada! intentalo de nuevo.'\");window.close();</script>";  
}else{
[
B]$query mysql_real_escape_string("SELECT pass FROM usuarios WHERE nombre ='$nombre'");
$response mysql_query($query);   // AKI ESTA LA CONSULTAAA!!        
$data mysql_fetch_array($response); // Y EL RESPONSE.. =( 
if($data['pass'] != $password) {
echo 
"<script type=\"text/javascript\">alert(\"Login Incorrecto\"); 
  window.close();</script>"
;
  }else{ 
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..

Última edición por JoseGMariani; 22/03/2010 a las 19:27 Razón: NO AGARRABA LA NEGRITA Y LE PUC FUE COMENTARIOS.. AL CODIGO
  #16 (permalink)  
Antiguo 22/03/2010, 19:29
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

dALE gracias cheru de aki a mañana vemso si alguien mas me a podido ayudar.. :S si no bueno hay esta lo q eh hechoo no habia leido tu comentario...

alguien mas que pueda ver el error.. =(
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #17 (permalink)  
Antiguo 22/03/2010, 19:40
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

TRIBY!

no ntend lo q me decias... ya eh arreglado lo de las comillas simples pero me sigu sin funcionar! mepodrias ayudar el codigo tal como lo tengo es como aparece en la ultima publicacion del mismo q esta aya arriba.. como tendria q modificarlo? ya eh arreglado lo de las comillas simples... ! =) espero tu grata ayuda Gracias..! :)!
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..
  #18 (permalink)  
Antiguo 22/03/2010, 20:16
 
Fecha de Ingreso: marzo-2010
Mensajes: 1
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Buen dia,

La mejor manera de evitar el sql injection es comprobar los datos que recibe el script y asi mismo, escaparlos.

Tienes a tu dispocision las funciones:
preg_replace
mysql_real_escape_string

La forma de usar la funcion mysql_real_escape_string es unicamente pasar el dato a escapar, mas no toda la consulta.
  #19 (permalink)  
Antiguo 23/03/2010, 01:27
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

Cita:
Iniciado por JoseGMariani
$query = mysql_real_escape_string("SELECT pass FROM usuarios WHERE nombre ='$nombre'");
$response = mysql_query($query) or die('Error en la consulta: ' . mysql_error());
$data = mysql_fetch_array($response);
Despues de que veas que el error es porque en vez de comillas simples aparece tambien una diagonal invertida \' intenta escapar solamente el nombre y despues armar la consulta.

Código PHP:
Ver original
  1. $nombre = mysql_real_escape_string($nombre);
  2. // Aqui armas tu $query, sin usar mysql_real_escape_string
  3. // Y despues continuas normal
__________________
- León, Guanajuato
- GV-Foto
  #20 (permalink)  
Antiguo 23/03/2010, 06:53
Avatar de JoseGMariani  
Fecha de Ingreso: diciembre-2008
Ubicación: Edo Lara
Mensajes: 251
Antigüedad: 15 años, 4 meses
Puntos: 8
Respuesta: alguien que me de Sugerencias para evitar mysql injection!?

l variable nombre la agarro por post entonces quedaria asi?

Código PHP:
$nombre=mysql_real_escape_string($_POST['nombre']); 

y la consulta la e dejado asi :
Código PHP:
$query mysql_query("SELECT pass FROM usuarios WHERE nombre='$nombre'")or die(mysql_error());      
$data mysql_fetch_array($query);
if(
$data['pass'] != $password) {....................... 
Ahora si me funciona es decir si melogea correctamente.. =) !

pero eso es todo? o.O asi estaria protegido mas o menos con mysql injection?
la opcion que antes habia puesto en la variable password
Código PHP:
$password=stripslashes($_POST['password']); 
tambien se la podria colocar para mayor seguridad? que me dices..?=) !
__________________
"Nunca seas arrogante con los humildes, ni humilde con los arrogantes." Paulo Coelho..

Etiquetas: injection, mysql, sugerencias
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:35.