Muchas gracias por responder.
Descarto que sea un error por lo que dice Master Solution. Además, los técnicos del hosting me han dicho que no es posible entrar a no ser que algún script permita acceder a la tabla o que alguien conozca las contraseñas de la BD.
Así que el problema debe estar en la página. Os explico la estructura y la forma en que he pensado investigar los fallos de seguridad para ver qué os parece.
Es una página de Usuarios. Pueden: 1.- Darse de alta. 2.- Pedir que se les envíe su contraseña olvidada. 3.- Ingresar en en su zona y modificar sus datos y preferencias.
Como en la tabla han dejado dos campos sin modificar (la fecha de registro y un número de usuario que se genera con rand), pienso que pueden haber accedido mediante un usuario y contraseña válido o haber obtenido todas las claves y luego haber modificado los datos de los (pocos) usuarios que había.
Porque si no fuese así, ¿por qué no atacar directamente borrando toda la tabla?. Esto es sólo una suposición para fijarme un punto de partida. ¿Os parece adecuado que empiece por ahi?.
Si no me decís lo contrario, empezaré investigando el acceso de Usuarios.
1.- Cuando piden la contraseña olvidada desde la página recuperapas.php:
Código PHP:
<form action="enviarpas.php\" method=\"post\">
<input size=\"25\" type=\"text\" name=\"email\">
Se accede a enviarpas.php
En enviarpas.php:
Código PHP:
include("conexion.php");
// Verifica si $email está en la tabla
$result = @mysql_query("SELECT *FROM tablausuarios WHERE email='$email'");
if (!$result) {
echo("<p>Error al seleccionar tabla: " . mysql_error() . "</p>");
exit();
}
//Se comprueba si existe el email
$sql_check_num = mysql_num_rows($result);
if($sql_check_num == 0){
echo "El email introducido no es correcto";
exit();
}
// Si el email existe saca los datos de la fila de la tabla
while ( $row = mysql_fetch_array($result) ) {
$email = $row["email"];
$password = $row ["password"];
$nombre = $row ["nombre"];
$apellidos = $row ["apellidos"];
}
// Se crea un correo y se envía
En este script acabo de ver dos cosas:
1.- No verifico que $email, que llega por URL, sea la posteada.
Quizá faltaría:
Código PHP:
$email= $_POST['email'];
¿Aumentaría así la seguridad?
2.- También veo que hago dos comprobaciones del email. Una de ellas podría suprimirse.
Como véis, aquí no utilizo sesiones. Lo único que se me ocurre es asegurarme de que la variable llegue vía POST.
1.- Cuando acceden con su email y contraseña:
Código PHP:
<input type="text\" size=\"15\" name=\"email\">
<input type=\"text\" size=\"15\" name=\"password\">
Esto les lleva a la página control.php:
Código PHP:
include("conexion.php");
//Busca email y contraseña
$ssql = "SELECT * FROM tablausuarios WHERE email='$email' and password='$password'";
$rs = mysql_query($ssql,$conn);
//vemos si el usuario y contraseña es válido
if (mysql_num_rows($rs)!=0)
{
//usuario y contraseña válidos
//Se define una sesion y se guardan datos
session_start();
$_SESSION['validado']= "SI";
$_SESSION['email']= "$email";
header("Location: paginausuario.php");
}
else
{
echo "Claves de acceso incorrectas";
}
Como se ve es un script muy usado. No se si tiene problemas de seguridad.
A mí se me ocurre que podría verificar el origen de las variables que llegan haciendo al principio:
Código PHP:
$email= $_POST['email'];
$password= $_POST['password'];
¿Aumentaría esto la seguridad?
paginausuario.php incluye este archivo (seguridad.php):
Código PHP:
<?php
session_start();
$var1 = $_SESSION["validado"];
if ($var1 != "SI") {
echo "No tiene autorización para entrar directamente a esta página
o se ha producido un error en la autentificación";
//Y se destruye la sesion
session_destroy();
exit();
}
?>
Y paginausuario.php permite modificar los datos a los usuarios y es así:
Código PHP:
<?php
session_start();
//pasa por el archivo que he comentado antes
include ("seguridad.php");
include("conexion.php");
$sql= mysql_query("SELECT * FROM tablausuarios WHERE email='$email'");
while ($row = mysql_fetch_array($sql) )
{
//recoge las variable obtenidas
$variable1 = $row[variable1];
$variable2 = $row[variable2];
//Las presenta en una tabla con formulario
<input type="text\" size=\"25\" name=\"nombre\" value=\"$nombre\">
etc....
//y las envía a procesa.php
}
procesa.php es así:
Código PHP:
<?php
session_start();
include ("seguridad.php");
//Comprueba que los campos los haya escrito bien (email, teléfono, etc)
//Si pasa estos filtros, actualiza la tabla
include("conexion.php");
$sSQL="UPDATE tablausuarios SET nombre='$nombre',..............fechaactual='$fecha' WHERE usuario ='$usuario'";
mysql_db_query("basedatos",$sSQL);
?>
No sé si podría aumentar la seguridad en esta parte controlando la sesión.
¿Qué pensais?
Perdonad lo extenso del post. He tratado de reducir el código al máximo dejando lo esencial.
Os agradeceré mucho vuestros consejos.
Gracias.