Foros del Web » Programando para Internet » PHP »

Problema de seguridad

Estas en el tema de Problema de seguridad en el foro de PHP en Foros del Web. Hola amigos, Tengo un problema de seguridad, el tema es que no se como (supongo que con inyección sql) están cambiando las passwords en la ...
  #1 (permalink)  
Antiguo 31/10/2009, 06:45
Avatar de jlmoreno31  
Fecha de Ingreso: mayo-2009
Ubicación: Barcelona
Mensajes: 174
Antigüedad: 14 años, 10 meses
Puntos: 2
Problema de seguridad

Hola amigos,

Tengo un problema de seguridad, el tema es que no se como (supongo que con inyección sql) están cambiando las passwords en la DDBB constantemente. No puede ser un usuario porque tenemos capado el crear una nueva cuenta así que tiene que ser desde el index. En index.php solamente hay un formulario para hacer login. y llama al archivo login.php, me podeis decir si lo tengo bien estructurado o como hacerlo para mejorar la seguridad?
Código:
<?php
@session_start();
    require('conexion.php');

    if (isset($_POST["email"])) {
    $email=$_POST["email"];
    $password=$_POST["password"];
	
	 if ($password==NULL|$email==NULL) {

	print "<script>";
	print " self.location='error5.php'";
	print "</script>"; 

    }else{   

 $query = mysql_query("SELECT email,password,id_shopper FROM shoppers WHERE email =\"".mysql_real_escape_string($email)."\"") or die(mysql_error());
    $data = mysql_fetch_array($query);
    if($data['password'] != $password) {
    print "<script>";
	print " self.location='error5.php'";
	print "</script>"; 
    }else{
    $query = mysql_query("SELECT email,password,id_shopper FROM shoppers WHERE email =\"".mysql_real_escape_string($email)."\"") or die(mysql_error());
    $row = mysql_fetch_array($query);
	$_SESSION["shoppers"] = $row['id_shopper'];
	$_SESSION["autenticado"] ='si';
	print "<script>";
	print " self.location='home.php?id_shopper=$_SESSION[shoppers]'";
	print "</script>"; 
	}
    }
    }
	
	?>
Hay algún gracioso que en vez de decirnos que tenemos un problema de seguridad, nos está cambiando las passwords, constantemente. Llevo dos ataques en dos días.

Gracias de antemano.
  #2 (permalink)  
Antiguo 31/10/2009, 09:12
Avatar de conkerick  
Fecha de Ingreso: febrero-2009
Ubicación: WWW
Mensajes: 75
Antigüedad: 15 años, 1 mes
Puntos: 2
Respuesta: Problema de seguridad

Creo que sería más conveniente que la consulta te devuelva los datos si el email y el password son correctos.

En vez de:

Código:
mysql_query("SELECT email,password,id_shopper FROM shoppers WHERE email =\"".mysql_real_escape_string($email)."\"") or die(mysql_error());
Sería:

Código:
mysql_query("SELECT email,password,id_shopper FROM shoppers WHERE email='mysql_real_escape_string($email)' AND password ='mysql_real_escape_string($password)' LIMIT 1") or die(mysql_error());
Entonces, si el email y password introducidos, no concuerda con algún registro de la BD, puedes redireccionar a otro lado, en cambio, si encuentra un registro don dichos datos, recuperas los campos que desees y muestras mensajes o redireccionas al usuario.

Esta una una idea muy básica, pero te puede servir a mejorar el login de tu aplicación, OJO no he probado si funciona:
Código PHP:
<?php
function limpiar_variables($var){
    
// REMPLAZO CARACTERES PARA EVITAR INYECCION
    
$pattern = array("'",'\\','<','>',"\"",";","$","|","{","}","+","#");
    
$var str_replace($pattern''$var);
    
// ESCAPO CON MYSQL Y LA VARIABLE DEBERIA ESTAR MUY LIMPIA
    
return mysql_escape_string($var);
}

$email limpiar_variables($_POST['email']);
$password limpiar_variables($_POST['password']);

if(
strlen($email) < or strlen($password) < 3){
    
// EL EMAIL O PASSWORD ES MUY CORTO, MENOR A 3 CARACTERES
    // MUESTRO MENSAJE O REDIRECCIONO
    
header('Location: error.php');
    exit();
}

// HAGO LA CONSULTA

$sql mysql_query("SELECT email,password,id_shopper FROM shoppers WHERE email='$email' AND password ='$password' LIMIT 1") or die(mysql_error());
// COMPRUEBO SI SE ENCONTRO UN REGISTRO CON DICHOS DATOS
if(mysql_num_rows($sql) == 1){
    
// SI ENCONTRO UN REGISTRO, LOS DATOS SON VALIDOS
    // AQUI HACES LO QUE DEBERIA HACER SI SON CORRECTOS
}
else{
    
// NO SE ENCONTRO UN REGISTRO DON DICHOS DATOS
    // REDIRECCIONO O MUESTRO MENSAJE
    
exit();
}
?>
Fíjate que la función "limpiar_variables" elimina caracteres potencialmente peligrosos y escapa la variable, osea, que debería estar limpia y evitar un poco más la inyección de código.

Saludos.
  #3 (permalink)  
Antiguo 31/10/2009, 10:45
Avatar de jlmoreno31  
Fecha de Ingreso: mayo-2009
Ubicación: Barcelona
Mensajes: 174
Antigüedad: 14 años, 10 meses
Puntos: 2
Respuesta: Problema de seguridad

Ok, por lo que veo la función limpiar_variables lo que hace es eliminar como muy bien dices caracterers potencialemente peligrosos. Lo voy a probar.
También he estado mirando un programa, se llama GreenSQL y por lo que veo es como un firewall para la BBDD, alguien lo ha probado?

Es que ya es la segunda vez que me cambian las passwords de la apliación.
Gracias y saludos.
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 03:25.