Evitar cookie nula en php

Iniciado por 0x0309, 18 Octubre 2009, 04:42 AM

0 Miembros y 1 Visitante están viendo este tema.

0x0309

Hola, me gustaría preguntar de qué manera se puede evitar una cookie nula.

Por ejemplo, en un sitio existía un mecanismo de autenticación algo así (los nombres los he cambiado):

/adm/control.php

<?php
session_start
();
if (
$_SESSION['auth'] != 'YES') {
    
header('Location: index.php');
}
echo 
'Panel de admin';
?>



/adm/index.php

<?php
echo 'No logeado';
?>



y al acceder a /adm/control.php se va a index.php porque no está registrada la variable de sesión.
Pero si modifico el contenido de la Cookie con tamper data así:


PHPSESSID=


Se produce lo siguiente:


Warning: session_start() [function.session-start]: The session id contains illegal characters, valid characters are a-z, A-Z, 0-9 and '-,' in C:\sitio\adm\control.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\sitio\adm\control.php:3) in C:\sitio\adm\control.php on line 3

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\sitio\adm\control.php:3) in C:\sitio\adm\control.php on line 3

Warning: Cannot modify header information - headers already sent by (output started at C:\sitio\adm\control.php:3) in C:\sitio\adm\control.php on line 5
Panel de admin


Entonces, mi pregunta es cómo evitar que session_start() se caiga ante un ataque así.


WHK

Ese es un bug de PHP, puedes actualizar php y no te debería suceder eso, es path disclosure.

Por otra parte:
Código (php) [Seleccionar]
<?php
session_start
();
if (
$_SESSION['auth'] != 'YES') {
    
header('Location: index.php');
}
echo 
'Panel de admin';
?>


está mal hecho porque enviará el header de redirección pero de todas formas dirá panel de admin ya que el script nunca terminó, o sea.... el servidor envía el header "location: index.php" y el explorador lo interpretará y se redireccionará pero en realidad también mostrará el contenido del panel de administración y cualquiera podría ingresar omitiendo ese header o haciendo la petición desde la consola de comandos.
Lo que debes hacer es ponerle un exit para que el script no siga:

Código (php) [Seleccionar]
<?php
session_start
();
if (
$_SESSION['auth'] != 'YES') {
 
header('Location: index.php');
 exit;
}
echo 
'Panel de admin';
?>

0x0309

ah, gracias por la info.

hice una funcion para iniciar sesión, aunque creo que es más práctico lo que dices de agregar el exit, y también un error_reporting(0).

Código (php) [Seleccionar]

function iniciar_sesion()
{
    if (!is_string($_COOKIE[session_name()])
          || preg_match(
              '/^[a-zA-Z0-9\,\-]{32}$/'
              , $_COOKIE[session_name()]
             ) != 1 ) {
        unset($_COOKIE[session_name()]);
    }
    session_start();
}