Domanda

Ho un sistema di autenticazione PHP sul mio sito web utilizzando la variabile $ _SESSION.

Una forma presenta un nome utente e una password per il file "login.php". E 'gestito in questo modo:

<?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");

}

In seguito, index.php viene caricato e controlla se 'logedin' è vero.

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

Sul mio server di produzione, continua, ma sul mio Wampserver, si ritorna ad login.php. Noto che Wampserver è molto lento nel caricamento della pagina, questo potrebbe avere a che fare qualcosa con esso. È per questo che ho inserito il session_write_close, per assicurarsi che i dati sessione viene salvata prima che le pagine sono accesi, ma non aiuta.

Il contenuto di session_start.inc.php sono semplicemente:

<?php
    session_start();
?>

ho usato per avere più codice in là, ma al momento è solo questo. Il problema esisteva anche prima ho iniziato ad usare un file di inclusione.

Qualcuno ha idea di cosa sto facendo male? Perché non WampServer trasmettere i miei dati di sessione al file PHP successivo?

È stato utile?

Soluzione 5

Dopo un lungo periodo di tempo ho fissato questo bug finalmente.

Al mio localhost WAMP, i dati della sessione non viene salvata tra caricamento della pagina, perché i dati della sessione è memorizzato in un cookie, e non c'è dominio cookie da impostare per localhost.

La soluzione:

  

'session.cookie_domain' deve essere impostato su una stringa vuota per tutti i nomi di dominio locale, non solo per il 'localhost' (ma non dovrebbe essere vuoto per gli indirizzi IP locali):

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

Grazie a Marcin Wiazowski che ha pubblicato qui .

Altri suggerimenti

del server WAMP 2 -. Impostazioni non sono impostate per impostazione predefinita per $_SESSION var

php.ini richiede le seguenti impostazioni

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 /

test Session - load.php -. carico $_SESSION 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);
?>

eseguire lo script nella vostra var_dump() browser dovrebbe produrre risultati

vai alla c:\wamp\tmp file contenenti i dati della sessione verranno visualizzate qui.

Prima di tutto:.? La logedin indice sembra strano per tenere traccia di un utente essere collegati E 'solo un errore di battitura su SO, o realmente un codice typo-

In secondo luogo (a seconda del comportamento desiderato), provare un approccio diverso per rendere le pagine protette da login. La pagina dovrebbe essere simile

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

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

Dove login.inc.php gestisce la sessione, cookie. In particolare, la funzione authorized dovrebbe restituire TRUE se un client è già connesso. Se un client non è connesso, dovrebbe mostrare una forma ad azione $_SERVER['PHP_SELF'] e ritorno FALSE. Se il nome della cosa presentare ingresso come login_submit, si può lasciare che login.inc.php gestire la verifica.

In questo modo, non è necessario fare riferimento gli utenti a una pagina di login dedicata, e dopo il login, l'utente vengono visualizzati direttamente la pagina richiesta. È possibile modificare questo un po 'per fare delle query stringhe persistente tramite login pure.

Prova a sostituire

if($_POST){...}

con

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

... almeno per il debugging. E 'possibile che alcune impostazioni differenti stanno provocando un array $ _POST non vuoto in cui non è previsto.

Inoltre, il codice sembra mancare exit() chiama dopo reindirizzamenti header(). L'invio di un HTTP Posizione di testa non si ferma automaticamente lo script.

Ho avuto questo problema utilizzando WAMPSERVER per lo sviluppo su / localhost. Avevo bisogno di cambiare session.use_only_cookies sia in linea o nell'impostazione php.ini da

session.use_only_cookies = 1

a

session.use_only_cookies = 0

Spiegazione

sessioni basate su cookie Utilizzando predefinite lavorava come previsto, ma ho bisogno di una soluzione di cookie-less. Una pagina di prova iniziale:

<?php
// page1.php

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

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

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

I dati della sessione è stato creato e memorizzato con successo nella directory temp WAMPSERVER, per esempio, C:\wamp\tmp\sess_0rkdlonl5uia717rf03d4svs16. Il collegamento generato dal codice di cui sopra è simile a (notare l'UID corrisponde al nome del file di dati di sessione):

page2.php?PHPSESSID=0rkdlonl5uia717rf03d4svs16

Ma la page2.php destinazione stava gettando errori non definiti per il 'tempo' variabile mentre cerca di recuperare i dati di sessione:

<?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>';
?>

Con l'impostazione session.use_only_cookies FALSE sia lo script prima session_start();:

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

o cambiando globalmente in 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

ha risolto il problema.

Di fronte lo stesso problema ma è stato causato da

session_regenerate_id(true);

Così ho cancellato dal mio codice.

Aggiorna per WAMP 2.5 e ora il problema è risolto!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top