Problema session PHP

  • Autor Autor davidkaotiko7
  • Fecha de inicio Fecha de inicio
D

davidkaotiko7

Curioso
¡Usuario con pocos negocios! ¡Utiliza siempre saldo de Forobeta!
Hola a todos.
Tengo un problema con mi session.
El problema comienza cada vez que borro caché, y vuelvo a ingresar en mi área.

Consta de tres archivos, formulario, login y el archivo donde muestro la información restringida.
El form funciona bien, el login recoge los datos y manda a la siguiente página, pero es la última la que no acepta el permiso.

Lo curioso es que borro la restricción de la última página, entro sin problemas por supuesto, y después vuelvo a incluir el mismo código que tenía antes en la página restringida, y ahora sí que acepta el código.

Funciona perfectamente, destruyo session y no se ve la zona restringida, accedo, y se ve.
El problema es saber porqué la primera vez no reconoce el permiso.

Os voy poniendo código.
La tabla, en la que tengo un usuario con permisos, 7777.

PHP:
CREATE TABLE `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(30) COLLATE latin1_spanish_ci NOT NULL,
  `usuario` varchar(30) COLLATE latin1_spanish_ci NOT NULL,
  `pass` varchar(30) COLLATE latin1_spanish_ci NOT NULL,
  `permisos` int(4) NOT NULL,
  `email` varchar(30) COLLATE latin1_spanish_ci NOT NULL,
  `fecha` date NOT NULL,
  PRIMARY KEY (`id`)
)

Login, que me acepta la información y me redirige a la siguiente.

PHP:
<?php
$conexion=mysql_connect('db','user','pass') or die('No hay conexión a la base de datos');
$db=mysql_select_db('tabla',$conexion)or die('no existe la base de datos.');

$usuarioIng=$_POST['user'];
$passIng=$_POST['permisos'];

session_start();
$consulta=mysql_query("select * from usuarios");
	    $puerta='continuar';	
		while($filas=mysql_fetch_array($consulta)and $puerta='continuar'){
			
			$id=$filas['id'];
			$nombre=$filas['nombre'];
			$usuario=$filas['usuario'];
			$pass=$filas['pass'];
			$fecha=$filas['fecha'];
			$permiso=$filas['permisos'];
							
			if (isset($usuarioIng)and isset($passIng)){
				if ($usuario==$usuarioIng and $passIng==$permiso){
					echo '<div class="ok">Bienvenido '.$usuario.'</div>';
					$miSession=array('id'=>$id,'nombre'=>$nombre,
							 'usuario'=>$usuario,'pass'=>$pass,
							 'fecha'=>$fecha,'permisos'=>$permiso);
					//ir a la pagina restringida
					$_SESSION['miSession']=$miSession;
					?>
                    <html>
                    	<head>
                        	<meta http-equiv="refresh" content="1; url= ../panel.php">   
                        </head>
                     </html>
                     <?php
					 $puerta='salir';
					 exit; 
				}else{
                        $resutado='no';				
					}
			}
			
		}
		if ($resutado=='no'){
		    echo '<div class="no">Su usuario o contraseña no se encontraron</div>';
			 ?>
             <html>
                    	<head>
                        	<meta http-equiv="refresh" content="3; url= acceso.php">   
                        </head>
                     </html>
             <?php
			
		}
?>

Aquí va la zona restringida.
PHP:
<?php 
session_start();
if ($_SESSION['miSession']['permisos']==7777){
    ?>  

    
    
    <?php
}else{
     echo '<div class="no">No tiene permisos</div>';
	 ?>
       <html>
          	<head>
               	<meta http-equiv="refresh" content="3; url= index.php">   
            </head>
       </html>
      <?php
}


?>
 
Última edición:
El problema que le veo es que en la sentencia de SQL del login le dices "tráeme todos los campos y filas de la tabla usuarios", después haces una verificación en "if ($usuario==$usuarioIng and $passIng==$permiso)", en caso de que no coincida la $respuesta es no.

La cuestión es que está dentro de un while y como has llamado a todos los usuarios el seguirá buscando y buscando hasta terminar con la tabla, por lo tanto, seguramente el último usuario de dicha tabla no coincide con los parámetros de la "verificación", por lo tanto, $respuesta es no.
 
El problema que le veo es que en la sentencia de SQL del login le dices "tráeme todos los campos y filas de la tabla usuarios", después haces una verificación en "if ($usuario==$usuarioIng and $passIng==$permiso)", en caso de que no coincida la $respuesta es no.

La cuestión es que está dentro de un while y como has llamado a todos los usuarios el seguirá buscando y buscando hasta terminar con la tabla, por lo tanto, seguramente el último usuario de dicha tabla no coincide con los parámetros de la "verificación", por lo tanto, $respuesta es no.

Qué crees que debería hacer?? Hago para que solo busque el campo que necesito??

Al ser solo un usuario podría evitar conectar a MySQL.
 
Qué crees que debería hacer?? Hago para que solo busque el campo que necesito??

Al ser solo un usuario podría evitar conectar a MySQL.

vos programaste eso?... como se le puede a alguien recorrer toda una tabla comparando campos... imaginate con miles y miles de users...

PHP:
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario='".$_POST['user']."' AND pass='".$_POST['pass']."'");
$filas = mysql_fetch_array($consulta);

if($filas['user']!=""){
 $id=$filas['id'];
            $nombre=$filas['nombre'];
            $usuario=$filas['usuario'];
            $pass=$filas['pass'];
            $fecha=$filas['fecha'];
            $permiso=$filas['permisos'];
 $miSession=array('id'=>$id,'nombre'=>$nombre,
                             'usuario'=>$usuario,'pass'=>$pass,
                             'fecha'=>$fecha,'permisos'=>$permiso);
                    //ir a la pagina restringida
                    $_SESSION['miSession']=$miSession;
 header('location: panel.php');
 die();
}else{
 die('NO tienes acceso');
}
 
Insertar CODE, HTML o PHP:
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario='".$_POST['user']."' AND pass='".$_POST['pass']."'");

Ese codigo es vulnerable a inyecciones SQL. Hay que limpiar la informacion recibida del usuario antes de usarla en una sentencia sql:

Insertar CODE, HTML o PHP:
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario='".mysql_real_escape_string($_POST['user'])."' AND pass='".mysql_real_escape_string($_POST['pass'])."'");
 
vos programaste eso?... como se le puede a alguien recorrer toda una tabla comparando campos... imaginate con miles y miles de users...

PHP:
$consulta = mysql_query("SELECT * FROM usuarios WHERE usuario='".$_POST['user']."' AND pass='".$_POST['pass']."'");
$filas = mysql_fetch_array($consulta);

if($filas['user']!=""){
 $id=$filas['id'];
            $nombre=$filas['nombre'];
            $usuario=$filas['usuario'];
            $pass=$filas['pass'];
            $fecha=$filas['fecha'];
            $permiso=$filas['permisos'];
 $miSession=array('id'=>$id,'nombre'=>$nombre,
                             'usuario'=>$usuario,'pass'=>$pass,
                             'fecha'=>$fecha,'permisos'=>$permiso);
                    //ir a la pagina restringida
                    $_SESSION['miSession']=$miSession;
 header('location: panel.php');
 die();
}else{
 die('NO tienes acceso');
}
Gracias. No, el código no es mio.
Acabo de probar este código, y todo lo demás, y no accede.
 
Atrás
Arriba