Pagina 1 di 4 1234 UltimaUltima
Risultati da 1 a 10 di 33

Discussione: header e session funzionano perfettamente in locale ma creano problemi in remoto

  1. #1
    L'avatar di Fabrizio Fiorita
    Fabrizio Fiorita è offline Utente del Forum
    Data Registrazione
    Sep 2012
    Località
    Roma, Civitavecchia, Anzio
    Messaggi
    43

    Angry header e session funzionano perfettamente in locale ma creano problemi in remoto

    Buongiorno.
    Ho creato un insieme di pagine PHP per consentire l'accesso a determinati Utenti - preselezionati e registrati in una tabella di DB - ai dati registrati sul DB stesso.
    La struttura di accesso è così progettata:
    1. Nella pagina_a.html è contenuto un form con due voci: username e password. Al SUBMIT si viene rinviati alla pagina_b.php
    2. La pagina_b.php effettua controlli di compatibilità e sanitarizzazione dell'input, poi verifica che username e password corrispondano nella tabella del DB. In caso di errore si viene rinviati alla pagina_a.html mediante funzione header. Se invece tutto è OK vengono scaricate dal DB le autorizzazioni previste per quell'utente, viene creato un oggetto utente, viene aperta una sessione, alla variabile di sessione viene assegnato l'oggetto utente ed il controllo viene trasferito alla pagina_c.php mediante funzione header
    3. La pagina_c.php visualizza un menu di accesso alle diverse funzioni consentite, con voci-menu differenziate a seconda del livello di autorizzazione consentito per quell'utente.

    Il tutto in locale (Win XP o Win7, Apache 2.4, PHP 5.4.4, testato con 5 browsers diversi) funziona perfettamente.
    Trasferendo il tutto in remoto (Linux, Apache 2, PHP 5.3.9), la funzione header viene del tutto ignorata: non dà alcun errore, nell'HTML della pagina il tag <body> è rigorosamente vuoto; se inserisco dell'output dopo la funzione header questo viene regolarmente visualizzato, come se la funzione header fosse assolutamente trasparente o inesistente.
    Escludo errori di sintassi o di logica, visto che la funzione in locale fa regolarmente il suo dovere.

    Ho verificato con phpinfo i settaggi di php.ini, che mi sembrano assolutamente identici fra di loro, a meno ovviamente delle nuove voci introdotte da 5.4.4 rispetto a 5.3.9, che però non dovrebbero avere alcuna attinenza con il problema.

    Per risolvere almeno temporaneamente il problema ho commentato le istruzioni header ed ho introdotto due pulsanti - uno per il caso di errore che mi rimanda indietro ed uno per il caso di OK che mi manda avanti - e qui si è presentato un secondo, incomprensibile problema.
    Il tutto in locale funziona a quel dio biondo, ma in remoto succede una cosa stranissima: quando dalla pagina_b.php passo alla pagina_c.php, all'apertura della sessione non viene riesumata la sessione già aperta ma ne viene aperta una nuova con un UID diverso.

    Escludo anche qui errori di sintassi o di logica, visto che la sessione in locale fa regolarmente il suo dovere.

    Ho ipotizzato una possibile mancata registrazione del cookie di sessione, ma l'ipotesi è piuttosto remota, visto che tutti i miei browsers accettano i cookies e il path dei cookies è rimasto quello "Master Value".

    Qualcuno ha avuto i miei stessi problemi? Forse mi è sfuggito qualche settaggio del php.ini? Io ho soltanto inserito (in ogni pagina e prima di session_name e session_start), sia in remoto sia in locale, il session.save_path ed ho verificato che viene utilizzato correttamente, ma quando passo alla seconda pagina della sessione, in quella cartella ci trovo l'UID della sessione di partenza, con tutti i dati che ci ho messo, ed un nuovo UID vuoto.

    Grazie a chi mi potrà aiiutare.
    Fabrizio

  2. #2
    L'avatar di alessandro1997
    alessandro1997 è offline Super Moderatore
    Data Registrazione
    Oct 2009
    Località
    Roma
    Messaggi
    5,142
    Imposta il livello di reporting degli errori a E_ALL sia in locale che in remoto (ovviamente solo a scopo di testing):
    Codice PHP:
    error_reporting(E_ALL); 
    Assicurati di inserirlo all'inizio di ogni script (oppure cambia il valore in php.ini). Vedi degli errori?

  3. #3
    L'avatar di Fabrizio Fiorita
    Fabrizio Fiorita è offline Utente del Forum
    Data Registrazione
    Sep 2012
    Località
    Roma, Civitavecchia, Anzio
    Messaggi
    43
    Fatta ogni possibile ricerca per gestione degli errori, senza alcun risultato. Nessuna ricerca mi ha segnalato errori.
    "header" viene semplicemente ignorato.
    "session" non trasferisce il SID e basta.

  4. #4
    L'avatar di alessandro1997
    alessandro1997 è offline Super Moderatore
    Data Registrazione
    Oct 2009
    Località
    Roma
    Messaggi
    5,142
    Direi che è strano, come minimo. Puoi postare i sorgenti di tutte e tre le pagine PHP?

  5. #5
    L'avatar di Fabrizio Fiorita
    Fabrizio Fiorita è offline Utente del Forum
    Data Registrazione
    Sep 2012
    Località
    Roma, Civitavecchia, Anzio
    Messaggi
    43
    Al momento i codici sono puntati alla risoluzione del problema SESSION, visto che il problema HEADER è aggirabile, pur con una soluzione che esteticamente non mi piace. Quindi le righe che riguardano lo HEADER sono commentate e sono invece attive le righe con i forms alternativi.

    La prima pagina è una pagina Joomla!, non ha contenuti PHP e si risolve nel solo FORM di accesso, quindi è inutile che la pubblichi.

    Pagina di verifica dell'accesso (verifica_accesso_direzionale.php):
    Codice PHP:
    <!DOCTYPE html>
    <html lang="it">
      <head>
        <meta charset="utf-8">
        <meta name="generator" content="CoffeeCup HTML Editor (www.coffeecup.com)">
        <meta name="created" content="mar, 03 lug 2012 15.02.57 GMT">
        <meta name="description" content="">
        <meta name="keywords" content="">
        <link rel="stylesheet" href="/templates/ff_sipbc_j11/css/sipbcall.css" type="text/css" media="all" />
        <title>Verifica accesso direzionale</title>
        <!-- Verifica se chi ha chiesto l'accesso direzionale è abilitato (dati provenienti da pagina Joomla) -->
        <!--[if IE]>
        <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
        <script type="text/javascript" src="../templates/ff_sipbc_j11/js/5shiv.js"></script>
        <![endif]-->
      </head>
    <body>
    <?php
    error_reporting
    (E_ALL);
      require_once(
    'costanti.inc');
      require_once(
    'dbconnect.inc');
      require_once(
    'userinfo.inc');
      
    $codice $_POST["codice"];
      
    $password $_POST["pw"];
      
    $conn = @new mysqli($db_server$db_user_name$db_password$db_name);
      if (
    mysqli_connect_errno() != 0)
        {
          
    $errno mysqli_connect_errno();
          
    $errmsg mysqli_connect_error();
          echo 
    '<article id="modiscriz1">'TESTATA;
          echo 
    'Errore connessione: ', ($errno),' ',$message'<input type="button" value="Torna indietro" onClick="javascript:history.go(-1)" />';
          exit;
        }
        
    $conn->query("SET NAMES 'utf8'");
        
    $query_str "SELECT * FROM accesso WHERE codice='$codice'";
          
    $result $conn->query($query_str);
          if (
    $result === FALSE)
             {
            
    $errno $conn->errno;
            
    $errmsg $conn->error;
            echo 
    '<article id="modiscriz1">'TESTATA;
            echo 
    'Errore dati: ($errno) $errmsg<br/>','<input type="button" value="Torna indietro" onClick="javascript:history.go(-1)" />';
            
    $conn->close();
            exit;
           }
         
    $row_data = @$result->fetch_array();
         
    $sha2=hash('sha256'$password);
         if (
    $sha2 != $row_data['password'])
             {
            echo 
    '<article id="modiscriz1">'TESTATA;
             echo 
    '<span style="color:red; font-weight:bold;">Codice e/o password non validi</span><br />';
             echo 
    '<input type="button" value="Torna indietro" onClick="javascript:history.go(-1)" />';
             
    $result->close();
             
    $conn->close();
             exit;
            }
           
    ini_set('session.save_path''../iscrizione/tmp/');
           
    session_name('ACCESSODIREZIONALE');
           
    session_start();
         
    $tipo $row_data['tipo'];
         
    $sezione $row_data['sezione'];
         
    $delegazione $row_data['delegazione'];
         
    $user = new UserInfo($codice$password$tipo$sezione$delegazione);
         
    $_SESSION['current_user'] = $user;
         if (isset(
    $result)): $result->close(); endif;
         if (isset(
    $conn)): $conn->close(); endif;
    // header('location:accesso_direzionale.php');
    // exit;
         
    echo '<br /><h3>Credenziali corrette per ';
         switch (
    $tipo
            { 
                 case 
    "1": echo "l'Amministratore del Sistema e la Segreteria Nazionale</h3>"; break;
                case 
    "2": echo 'il Presidente ed il  Segretario Generale</h3>'; break;
                case 
    "3": echo 'la '$sezione'</h3>'; break;
                case 
    "4": echo 'la '$delegazione'</h3>'; break;
            }
         echo 
    '<form method="post" name="avvio" action="accesso_direzionale.php">',
               
    '<button type="submit" />Accedi</button>',
              
    '</form>';
    //       exit;
    ?>
    </article>
    </body>
    </html>
    Pagina di accesso (accesso_direzionale.php)
    Codice PHP:
    <!DOCTYPE html>
    <?php
    error_reporting
    (E_ALL);
      require_once(
    'costanti.inc');
      require_once(
    'dbconnect.inc');
      require_once(
    'userinfo.inc');
      
    ini_set('session.save_path''../iscrizione/tmp/');
      
    session_name('ACCESSODIREZIONALE');
      
    session_start();
    ?>
    <html lang="it">
      <head>
        <meta charset="utf-8">
        <meta name="generator" content="CoffeeCup HTML Editor (www.coffeecup.com)">
        <meta name="created" content="mar, 03 lug 2012 15.02.57 GMT">
        <meta name="description" content="">
        <meta name="keywords" content="">
        <link rel="stylesheet" href="/templates/ff_sipbc_j11/css/sipbcall.css" type="text/css" media="all" />
        <title>Accesso direzionale</title>
        <!-- Riceve OK da verifica_accesso.php e seleziona il tipo di autorizzazione per l'utente -->
        <!--[if IE]>
        <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
        <script type="text/javascript" src="../templates/ff_sipbc_j11/js/5shiv.js"></script>
        <![endif]-->
      </head>
    <body>
    <?php
      print_r
    (session_id()); // togliere dopo debug
      
    print_r(session_name()); // togliere dopo debug
      
    $user $_SESSION['current_user'];
      
    $codice $user->get_codice();
      
    $tipo $user->get_tipo();
      
    $pwu $user->get_pwu();
      
    $sezione $user->get_sezione();
      
    $delegazione $user->get_delegazione();
      
    $errore FALSE;
      echo 
    '<article id="modiscriz1">';
      echo 
    TESTATA;
      switch (
    $tipo)
       {
        case 
    "1":
    ?>
                  <table style="width:1000px; border:black 5px ridge; color:blue; margin:auto; text-align:center;">
                  <tr style="font-weight:bold; text-align:center;">
                        <td colspan="5"><p>Accesso consentito con privilegi dell'Amministratore di sistema.</p></td>
                      </tr>
                  <tr>
                      <td><form method="post" name="avvio" action="../phpmyadmin" target="_blank">
                             <button type="submit" />Database</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="abilita.php">
                             <button type="submit" />Abilita accesso</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_abilitati.php">
                             <button type="submit" />Elenco abilitati</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_iscrizioni.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Iscr. individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_iscrizioni_collettive.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Iscr. collettive</button>
                   </form></td>
                  </tr>
                  <tr>
                      <td><form method="post" name="avvio" action="nuovo_onore.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Ins. Membri On.</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_onore.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Membri d'Onore</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_soci.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Soci individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_collettivi.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Soci collettivi</button>
                   </form></td>
    <?php
        
    break;
        case 
    "2":
    ?>
                   <table style="width:1000px; border:black 5px ridge; color:blue; margin:auto; text-align:center;">
                  <tr style="font-weight:bold; text-align:center;">
                        <td colspan="3"><p>Accesso consentito con privilegi della Direzione Nazionale.</p></td>
                      </tr>
                      <tr>
                      <td><form method="post" name="avvio" action="lista_iscrizioni.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Iscr. individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_iscrizioni_collettive.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Iscr. collettive</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_onore.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Membri d'Onore</button>
                   </form></td>
                   </tr>
                   <tr>
                      <td><form method="post" name="avvio" action="lista_soci.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Soci individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_collettivi.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                             <button type="submit" />Soci collettivi</button>
                   </form></td>
    <?php
        
    break;
        case 
    "3":
    ?>
                   <table style="width:1000px; border:black 5px ridge; color:blue; margin:auto; text-align:center;">
                  <tr style="font-weight:bold; text-align:center;">
                        <td colspan="5"><p>Accesso consentito con privilegi della <?php echo $sezione?>.</p></td>
                      </tr>
                      <tr>
                      <td><form method="post" name="avvio" action="lista_iscrizioni.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="sezione" value="<?php echo $sezione?>" hidden="TRUE" />
                             <button type="submit" />Iscr. individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_iscrizioni_collettive.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="sezione" value="<?php echo $sezione?>" hidden="TRUE" />
                             <button type="submit" />Iscr. collettive</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_soci.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="sezione" value="<?php echo $sezione?>" hidden="TRUE" />
                             <button type="submit" />Soci individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_collettivi.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="sezione" value="<?php echo $sezione?>" hidden="TRUE" />
                             <button type="submit" />Soci collettivi</button>
                   </form></td>
    <?php
        
    break;
        case 
    "4":
    ?>
                   <table style="width:1000px; border:black 5px ridge; color:blue; margin:auto; text-align:center;">
                  <tr style="font-weight:bold; text-align:center;">
                        <td colspan="5"><p>Accesso consentito con privilegi della <?php echo $delegazione?>.</p></td>
                      </tr>
                      <tr>
                      <td><form method="post" name="avvio" action="lista_iscrizioni.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="delegazione" value="<?php echo $delegazione?>" hidden="TRUE" />
                             <button type="submit" />Iscr. individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_iscrizioni_collettive.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="delegazione" value="<?php echo $delegazione?>" hidden="TRUE" />
                             <button type="submit" />Iscr. collettive</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_soci.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="delegazione" value="<?php echo $delegazione?>" hidden="TRUE" />
                             <button type="submit" />Soci individuali</button>
                   </form></td>
                      <td><form method="post" name="avvio" action="lista_collettivi.php">
                           <input type="hidden" name="tipo" value="<?php echo $tipo?>" hidden="TRUE" />
                           <input type="hidden" name="delegazione" value="<?php echo $delegazione?>" hidden="TRUE" />
                             <button type="submit" />Soci collettivi</button>
                   </form></td>
    <?php
        
    break;
       }
    ?>  
                   <td>
                      <form method="post" name="avvio" action="../index.php?option=com_content&view=article&id=719&Itemid=898&lang=it">
                             <button type="submit" />Cambio accesso</button>
                      </form></td>
          </tr>
      </table>
      </article>
      </body>
    </html>
    Credo comunque che non troverai nulla nel codice: a parer mio il problema dovrebbe stare nel settaggio di php.ini sul server remoto, qualcosa che mi sfugge o che non so.

  6. #6
    L'avatar di alessandro1997
    alessandro1997 è offline Super Moderatore
    Data Registrazione
    Oct 2009
    Località
    Roma
    Messaggi
    5,142
    Probabilmente ho trovato il problema: la chiamata a session_start() deve essere posizionata prima di qualunque altro output (prima del doctype, nel tuo caso), perché imposta un cookie e dunque invia un header. Più in generale, qualunque header deve essere inviato prima dell'output, in quanto in una normale risposta HTTP gli header vengono prima del contenuto.

  7. #7
    L'avatar di Fabrizio Fiorita
    Fabrizio Fiorita è offline Utente del Forum
    Data Registrazione
    Sep 2012
    Località
    Roma, Civitavecchia, Anzio
    Messaggi
    43
    Grazie del tuo interessamento.
    A parte il fatto che dubito di poter mettere qualcosa prima del DOCTYPE, questo non spiega perché il tutto funzioni perfettamente in locale: se sono violate le condizioni dello header lo dovrebbero essere sempre e dovunque, non credi?
    Ci provo, ma permettimi di dubitare della riuscita.
    Hai trovato qualcosa sul php.ini?

  8. #8
    L'avatar di Fabrizio Fiorita
    Fabrizio Fiorita è offline Utente del Forum
    Data Registrazione
    Sep 2012
    Località
    Roma, Civitavecchia, Anzio
    Messaggi
    43
    Sembra che il problema SESSION sia risolto, ma se dovessi dire dov'era l'inghippo proprio non lo saprei dire con esattezza.
    Credo - ma non ne ho le prove - che dipenda dalla sequenza con la quale sono scritte determinati codici: mettendo il recupero della variabile $_SESSION subito dopo il session_start ha funzionato.
    E' possibile che PHP 5.3.9 (il server remoto) pretenda le cose in un certo ordine e che invece il successivo PHP 5.4.4 (il server locale) le accetti comunque.

    Adesso mi tocca occuparmi della funzione HEADER, per la quale non ho nessun indizio.

  9. #9
    L'avatar di borgo italia
    borgo italia è offline Super Moderatore
    Data Registrazione
    Feb 2008
    Località
    PR
    Messaggi
    11,212
    ciao
    a che ne so io la header dovrebbe venire prima di qualsiasi output html, salvo ridirigere il flusso, e nella direzionale.php prima c'è diverso html

  10. #10
    L'avatar di Fabrizio Fiorita
    Fabrizio Fiorita è offline Utente del Forum
    Data Registrazione
    Sep 2012
    Località
    Roma, Civitavecchia, Anzio
    Messaggi
    43
    Citazione Originariamente Scritto da borgo italia Visualizza Messaggio
    ciao
    a che ne so io la header dovrebbe venire prima di qualsiasi output html, salvo ridirigere il flusso, e nella direzionale.php prima c'è diverso html
    Tutto l'output che sta prima dello header è soggetto a delle if, lo header viene raggiunto solo se tutte le if sono negative, se viene stampato qualcos'altro vuol dire che i dati del form non sono stati accettati e quindi la pagina non raggiunge lo header.
    Il manuale di Wandschneider ritiene che anche gli include e require bloccano header, quindi ho provato a mettere tutta la pagina fra ob_start e ob_end_flush, ma senza successo.
    Adesso provo un altro suggerimento, cioè la ricostruzione dell'indirizzo assoluto della pagina mediante HTTP_HOST e PHP_SELF.
    A mio parere il problema non sta nel codice, ma, come già visto per SESSION, nella versione PHP del mio server remoto, che ha certe pretese (peraltro ignote) poi eliminate con le versioni successive come quella del mio server locale.

Pagina 1 di 4 1234 UltimaUltima

Tag per Questa Discussione

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •