Pregunta

Tengo un sistema de autenticación de PHP en mi sitio web utilizando la variable $ _SESSION.

Un formulario envía un nombre de usuario y contraseña para el "login.php" archivo. Se maneja como esto:

<?php include '../includes/sessionstart.inc.php'; ?>
<?php ob_start(); ?>

if($_POST){
    $q = mysql_query("SELECT id, company FROM users WHERE username = '".mysql_real_escape_string($_POST['username'])."' AND password = '".md5($_POST['password'])."'");
    if(mysql_num_rows($q) >= 1){
        $f = mysql_fetch_Array($q);
        $_SESSION['company'] = $f['company'];
        $_SESSION['id'] = $f['id'];
        $_SESSION['logedin'] = true;
        session_write_close();

        ob_clean();
        header("Location: index.php");

}

Después, index.php se carga y se comprueba si 'logedin' es verdadera.

<?php include '../includes/sessionstart.inc.php'; ?>
<?php if(!isset($_SESSION['logedin'])) header('Location: login.php'); ?>

En mi servidor de producción, que continúa, pero en mi Wampserver, vuelve de nuevo a login.php. Me he dado cuenta de que Wampserver es muy lento en la carga de la página, esto podría tener que hacer algo con ella. Es por eso que he incluido el session_write_close, para asegurarse de que los datos de sesión se guarda antes de que se conmutan las páginas, pero no ayuda.

El contenido de session_start.inc.php son simplemente:

<?php
    session_start();
?>

Yo solía tener más código en allí, pero por el momento es sólo esto. El problema también existía antes de que empecé a usar un archivo de inclusión.

¿Alguien tiene una idea de lo que estoy haciendo mal? ¿Por qué no Wampserver transmitir mis datos de la sesión a la siguiente archivo PHP?

¿Fue útil?

Solución 5

Después de mucho tiempo he fijado este error, finalmente.

En mi localhost WAMP, los datos de sesión no se guarda entre las cargas de la página, ya que los datos de sesión se almacena en una cookie, y no hay dominio de las cookies que se fijará para localhost.

La solución:

  

'session.cookie_domain' debe estar configurado en cadena vacía para todos los nombres de dominio local, no sólo para 'localhost' (pero no debe estar vacío para direcciones IP locales):

<?php
ini_set('session.cookie_domain', (strpos($_SERVER['HTTP_HOST'],'.') !== false) ? $_SERVER['HTTP_HOST'] : '');
?>

Gracias a Marcin Wiazowski que lo publicó aquí .

Otros consejos

servidor WAMP - 2. Ajustes no se establecen de forma predeterminada para $_SESSION var

PHP.ini requiere la siguiente configuración

C:\wamp\bin\apache\apache2.4.2\bin\php.ini
session.cookie_domain =
session.use_cookies = 1
session.save_path = "c:\wamp\tmp"   ;ensure the \ is used not /

pruebas de Sesión - load.php -. $_SESSION carga var

<?PHP
session_start();
$_SESSION['SESS_MEMBER_ID'] = 'stored variable';
session_write_close();
header("location:print.php");
?>

print.php -. Print $ _SESSION var

<?PHP
session_start();
var_dump($_SESSION);
?>

ejecuta el script en su navegador var_dump() debe producir resultados

A Archivos c:\wamp\tmp que contiene los datos de la sesión aparecerán aquí.

En primer lugar: el índice de logedin parece extraño para hacer el seguimiento de un usuario está conectado Se trata sólo de un error tipográfico en el SO, o en realidad un código typo

.?

En segundo lugar (dependiendo del comportamiento deseado), intente otro enfoque para hacer páginas con acceso protegido. Tu página debería parecerse a

<?php
  include 'login.inc.php';

  if(authorized()) {
    // put some more script here, if needed
    ?>
    // put some plain HTML here  
    <?php
  }
?>

Cuando login.inc.php se encarga de la sesión, las cookies. En particular, la función authorized debe devolver TRUE si un cliente ya está conectado. Si un cliente no está conectado, debería mostrar un formulario con $_SERVER['PHP_SELF'] acción y de retorno FALSO. Si nombra el presente algo de insumos como login_submit, puede dejar que la manija login.inc.php la verificación.

De esta manera, no es necesario remitir a los usuarios a una página de acceso dedicado, y después de iniciar la sesión, el usuario se muestran directamente la página solicitada. Se pueden ajustar esto un poco para hacer la consulta cuerdas persistente a través de inicio de sesión también.

Trate de reemplazar

if($_POST){...}

con

if( isset($_POST['username']) && isset($_POST['password']) ){...}

... al menos para fines de depuración. Es posible que algunas configuraciones diferentes están causando una matriz $ _POST no vacío, donde no se espera.

Además, el código parece faltar llamadas exit() después de redirecciones header(). Enviando un HTTP Localización cabecera no se detiene automáticamente la secuencia de comandos.

he tenido este problema utilizando WAMPServer para el desarrollo de encendido / localhost. Necesitaba cambiar session.use_only_cookies ya sea en línea o en la configuración de php.ini

session.use_only_cookies = 1

a

session.use_only_cookies = 0

Explicación

sesiones basadas en cookies por defecto Utilizando estaba funcionando como se esperaba pero necesitaba una solución sin cookies. Una página de prueba de encendido:

<?php
// page1.php

ini_set('session.use_cookies', '0');
session_start();

$_SESSION['time'] = time();

echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>

Los datos de sesión se crea y se almacena con éxito en el directorio temporal WAMPServer, por ejemplo, C:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16. El enlace generado por el código anterior es similar a (tenga en cuenta el UID coincida con el nombre del archivo de datos de sesión):

page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16

Pero el destino estaba tirando pagina2.php errores no definidos para el 'tiempo', mientras que la variable intentar recuperar los datos de sesión:

<?php
// page2.php

ini_set('session.use_cookies', '0');
session_start();

echo date('Y m d H:i:s', $_SESSION['time']);

echo '<br /><a href="page1.php?' . SID . '">page 1</a>';
?>

Al establecer FALSO session.use_only_cookies ya sea en el guión antes de session_start();:

ini_set('session.use_only_cookies', '0');

o cambiar globalmente en php.ini:

; This option forces PHP to fetch and use a cookie for storing and maintaining
; the session id. We encourage this operation as it's very helpful in combatting
; session hijacking when not specifying and managing your own session id. It is
; not the end all be all of session hijacking defense, but it's a good start.
; http://php.net/session.use-only-cookies
session.use_only_cookies = 0

resolvió el problema.

Ante el mismo problema pero estaba siendo causado por

session_regenerate_id(true);

Así que acaba de eliminar de mi código.

Actualizar a WAMP 2.5 y ahora el problema está resuelto!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top