URL redirigida a pesar de que estoy conectado - PHP / Sesión

Tengo una página de administración (../index2.php) Me gustaría iniciar sesión como mi URL de inicio cuando abro el navegador por primera vez. Tienes que iniciar sesión para ver esta página con nombre de usuario y contraseña. Obviamente, si cierro la sesión y cierro el navegador, luego lo vuelvo a abrir, debería redirigir a la página de inicio de sesión. Este es el código superior de la página index2.php cuando se abre por primera vez:

<?php
      require_once ("../includes_kl/initialize.php"); // simply sets up database and other classes including session class
?>
<?php
    if(!$session->is_logged_in()) {
    redirect_to("/cms/login.php");
    }
?>

Se redirigirá a la página login.php, pero esa página hace esto:

require_once ("../../includes_kl/initialize.php");
if ($session->is_logged_in()) {// Skip login page if already logged in.
    redirect_to("index.php");
}

Y como aparentemente ahora estoy conectado (no estoy seguro de cuándo sucedió eso), va a index.php.

Verifico que mis cookies están configuradas cuando abro el navegador. Y las cookies hacen esto:

  private function check_login() {

    if (isset($_COOKIE['user_id']) && (isset($_COOKIE['username']))) {
        $_SESSION['user_id']= $_COOKIE['user_id'];
        $_SESSION['username'] = $_COOKIE['username'];

    }

    if (isset($_SESSION['user_id'])) {
        $this->user_id = $_SESSION['user_id'];
        $this->username = $_SESSION['username'];
        $this->logged_in = true;
    } else {
        unset($this->user_id);
        $this->logged_in = false;
    }
}

My session Constructor:

function __construct() {
      session_start();
      $this->check_login();
}

ACTUALIZACIÓN: agregué este código para hacer eco de las variables:

function __construct() {
      session_start();
      $this->check_login();
       if ($this->logged_in) {
        echo "Session User Success: " . $this->username;
        } else {
        echo "Session User Fail";
        }
}

Devuelve el "Error de usuario de sesión" cuando abro el navegador por primera vez (eliminé la redirección con fines de prueba en index2.php para poder ver los resultados).

ACTUALIZADO 2:

He rastreado problemas como que las cookies NO están configuradas.

Aquí es donde los configuro:

public function login($user) {
    global $database;
    if ($user) {
        $this->user_id = $_SESSION['user_id'] = $user->id;
        $this->username = $_SESSION['username'] = $user->username;
        setcookie('user_id', $this->user_id, time() + (60 * 60 * 24 * 14));
        setcookie('username', $this->username, time() + (60 * 60 * 24 * 14));
        $this->logged_in = true;
      }
}

¿Se está haciendo esto correctamente? Esto es parte de cuando el usuario inicia sesión. Verifiqué en Chrome que las cookies están configuradas. Sin embargo, en el método check_login(), no los encuentra en esa primera declaración "si". La prueba "isset" falla.

preguntado el 22 de mayo de 12 a las 18:05

¿Puede repetir sus variables de sesión para verificar si tienen algún valor cuando inició sesión?

Bueno, intenté hacer eco cuando index2.php se abrió por primera vez, y muestra que el valor ($sesión->nombre de usuario) está vacío. Pero no estoy seguro de que este sea el mejor lugar para probar. ¿Quizás dentro de la clase Session sería mejor? -

sí, debe repetirlo donde se inicializa para verificar si se le dio algún valor. -

Verifique el código actualizado hacia la parte inferior, parece que regresan vacíos. -

parece que su check_login no está haciendo lo que se supone que debe hacer. ¿Por qué no intentas hacer algo como $_SESSION['var'] = $_POST['var']; en lugar de la cookie, ya que parece que su variable de cookie está vacía. Sin embargo, no estoy tan familiarizado con las cookies, ya que prefiero usar sesiones para este tipo de verificación. -

2 Respuestas

Tienes que revisar varias cosas.

Debe verificar los encabezados HTTP de respuesta del servidor y buscar allí el encabezado Set-Cookie. Si está ahí, entonces no es un problema con galleta función. Deberá verificar los encabezados HTTP de solicitud del cliente y buscar el encabezado de Cookie allí.

Sin embargo, es más posible que no tenga un encabezado de Cookie en la respuesta de su servidor. Puede ocurrir por diferentes razones, pero la más probable es por la advertencia "Encabezados ya enviados". Si tiene display_errors = off en su configuración, puede ver esta advertencia solo en sus archivos de registro. Significa que su servidor ha iniciado la transferencia de datos (es decir, el cuerpo de la respuesta HTTP) antes de que se llamara a la función de inicio de sesión y no puede configurar ningún otro encabezado. Puedes comprobarlo usando encabezamiento función. Para hacerlo, debe colocar este código al comienzo de index2.php:

header('Start: OK');

y este código dentro de la función check_login:

header('Check-Login: OK');

Después de eso, debe verificar qué encabezados tiene en su respuesta.

Y una cosa más. Debes evitar construcciones como esa:

$_SESSION['user_id']= $_COOKIE['user_id'];
$_SESSION['username'] = $_COOKIE['username'];

Es una verdadera brecha de seguridad. En la medida en que puedo cambiar las cookies en el lado del cliente, puedo iniciar sesión con las credenciales de cualquier usuario.

contestado el 22 de mayo de 12 a las 23:05

Hola, gracias por la respuesta, en realidad lo descubrí y tenía que ver con otra cosa. La nueva respuesta está publicada. Sin embargo, gracias por el consejo de seguridad, realmente necesito practicar mejor con eso. - elmaestrodelaslechugas

Lo descubrí con la ayuda de otra pregunta. Tenía que ver con las cookies. Simplemente necesito establecer la ruta y el dominio en el método setcookie().

setcookie('nombre de usuario', $este->nombre de usuario, hora() + (60 * 60 * 24 * 14), '/', 'dominio.com');

Mi login.php (donde se configuró la cookie por primera vez) estaba en un una experiencia diferente nivel de carpeta que mi index2.php al que se estaba abriendo el navegador. Así que la galleta fue , solamente configurado para las carpetas en el nivel 'dominio.com/carpeta/AQUÍ' (aquí es donde estaba mi login.php: dominio.com/CMS/login.php).

Por otro lado, estaba abriendo el navegador en dominio/index2.php donde la cookie no estaba configurada. Luego, lo envió a la página login.php donde se vio la cookie para que pasara la misma prueba que solo en el campo y lo redirigirá a index.php donde no había iniciado sesión. Por eso mi navegador me estaba abriendo arriba en index.php Y conectado.

contestado el 23 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.