Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    file_get_contents resetta la sessione

    Salve a tutti! Ho un problema con la funzione file_get_contents() di php.
    Ho creato un sito in php con delle pagine visibili solo dopo autenticazione. Una delle pagine del sito deve essere trasformata, cliccando un bottone, in un file pdf; per fare questo io, ora come ora, sto usando la libreria dompdf.
    Tramite questo codice:
    Codice PHP:
    echo $myCookie $_SERVER['HTTP_COOKIE'];
    $opts = array('http' => array('header'=> 'Cookie: ' $myCookie ."\r\n"));
        
        
    $context stream_context_create($opts);
        
    $contents file_get_contents("http://localhost:8888/mypage.php?datainizio=$datainizio&datafine=$datafine&operatore=1"false$context); 
    riesco ad ottenere il contenuto della pagina per poi passarlo alla libreria dompdf per generare il file pdf; quello che però succede, e qui veniamo al mio problema, è che mi si resetta la sessione e devo per forza rifare l'autenticazione con user e password per poter continuare a navigare nel sito. C'è un modo per mantenere la sessione attiva anche dopo aver usato la funzione file_get_contents()?

    Grazie mille a tutti!

  2. #2
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Dubito fortemente che il problema sia la file_get_contents. È possibile vedere il codice della pagina mypage.php?

  3. #3
    Originariamente inviato da _debo
    Dubito fortemente che il problema sia la file_get_contents. È possibile vedere il codice della pagina mypage.php?
    Grazie _debo per la risposta, ma non credo sia la pagina mypage.php il problema perché se ci navigo tramite browser la sessione resta impostata. In tutti i casi ecco il codice di mypage.php:
    Codice PHP:
    <?php
    // Mi connetto al database
    require 'db_connect.php';

    // Importo la funzione per visualizzare la data nel formato italiamo d-m-Y
    require 'dataDisplayIta.php';

    // Trovo l'utente loggato
    $userOperatore = require 'get_user.php';
    $operatoreid $userOperatore['id'];
    $operatorenome $userOperatore['nome'];

    // Solo l'utente 1 può vedere la pagina
    if ($operatoreid != 1) {
        
    header('location: index.php');
    }

    // Imposto i valori della data da visualizzare,
    // se nessuna data è selezionata imposta la data corrente.
    // Se invece la data di inizio è > alla data di fine le inverto.
    if (isset ($_GET['datainizio']) and isset ($_GET['datafine'])) {
        
    $datainizio $_GET['datainizio'];
        
    $datafine $_GET['datafine'];
        
    // Se $datainizio > $datafine inverto i valori.
        
    if ($datainizio $datafine) {
            
    $datatemp $datainizio;
            
    $datainizio $datafine;
            
    $datafine $datatemp;
        }
    } else {
        
    $datainizio date("Y-m-d");
        
    $datafine date("Y-m-d");
    }

    // Cambio il formato della data
    $datainizioIta data_it($datainizio);
    $datafineIta data_it($datafine);

    // Imposto il titolo della pagina    
    if ($datafine != $datainizio){
        
    $titolo "Cassa dal $datainizioIta al $datafineIta";
    } else {
        
    $titolo "Cassa del $datafineIta";
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <link href="style.css" rel="stylesheet" type="text/css" media="all" />
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <title><?php echo "$titolo"?></title>
        </head>
        <body>
            <div class="body">
    <?php
    Dopo ci sono solo le query al database e le tabelle per visualizzarle.

    Grazie mille ancora per l'aiuto

  4. #4
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    In questa pagina vedo ben tre include che potrebbero potenzialmente toccare le sessioni, specialmente quella get_user.php non mi piace per niente

  5. #5
    Originariamente inviato da _debo
    In questa pagina vedo ben tre include che potrebbero potenzialmente toccare le sessioni, specialmente quella get_user.php non mi piace per niente
    Ciao, grazie per l'aiuto
    Tutti e tre gli include sono presenti in ogni pagina del mio sito. Il primo è la connessione al database, non tocca minimamente le sessioni: c'è solo un mysql_connect e un mysql_select_db. Il secondo include è una funzione che converte la data dal formato inglese al formato italiano e questo è il codice della pagina:
    Codice PHP:
    <?
    function data_it($data)
    {
      
    // Creo una array dividendo la data YYYY-MM-DD sulla base del trattino
      
    $array explode("-"$data); 

      
    // Riorganizzo gli elementi in stile DD/MM/YYYY
      
    $data_it $array[2]."/".$array[1]."/".$array[0]; 
      
      
    // Restituisco il valore della data in formato italiano
      
    return $data_it
    }
    ?>
    Il terzo include invece mi serve per far vedere alcune pagine soltanto alle persone che hanno eseguito l'accesso, reindirizzando le altre alla pagina index; questo è il codice:
    Codice PHP:
    <?php
    session_start
    ();
    session_regenerate_id(TRUE);

    // Controllo accesso
    if (!isset($_SESSION['user'] ))
    {
        
    header('location: index.php');
    }
    else
    {
        
    $user $_SESSION['user'];
        
        require_once 
    'db_connect.php';
        
    $sql "SELECT id, nome FROM operatori WHERE user LIKE '$user'";
        
    $users_data = @mysql_query($sql);
        if (!
    $users_data) {
        exit (
    '

    Non sono riuscito ad ottenere l\'operatore dal database. Contattare l\'amministratore.</p>'
    );
        }
        
        while (
    $user_data mysql_fetch_array($users_data)) {
            
    $user_array['id'] = $user_data['id'];
            
    $user_array['nome'] = $user_data['nome'];
        }
        return 
    $user_array;
        
    }
    ?>
    Ho fatto delle prove e ora riesco a far funzionare tutto ripristinando manualmente la sessione con un altro problema però: devo scrivere direttamente l'user e la password dell'utente nella pagina:
    Codice PHP:
    <?php
    // Mi connetto al database
    require 'db_connect.php';

    // Includo la libbreria dompdf
    require_once("dompdf/dompdf_config.inc.php");


    // Trovo l'utente
    $operatoreid $_GET['operatore'];

    // Solo l'utente 1 può vedere la pagina
    if ($operatoreid != 1) {
        
    header('location: index.php');
        exit();
    }

    // Trovo il valore dei cookie
    $myCookie $_SERVER['HTTP_COOKIE'];
      

    // Imposto i valori della data da visualizzare,
    // se nessuna data è selezionata imposta la data corrente.
    // Se invece la data di inizio è > alla data di fine le inverto.
    if (isset ($_GET['datainizio']) and isset ($_GET['datafine'])) {
        
    $datainizio $_GET['datainizio'];
        
    $datafine $_GET['datafine'];
        
    // Se $datainizio > $datafine inverto i valori.
        
    if ($datainizio $datafine) {
            
    $datatemp $datainizio;
            
    $datainizio $datafine;
            
    $datafine $datatemp;
        }
    } else {
        
    // Faccio il redirect
        
    header('location:index.php');
        exit;
    }

    // Controllo che la proprietà mail sia correttamente impostata
    if (isset($_GET['mail']) AND (($_GET['mail'] == 'no') OR ($_GET['mail'] == 'yes'))){
        
        
    $mailValue $_GET['mail'];
        
    $opts = array('http' => array('header'=> 'Cookie: ' $myCookie ."\r\n"));
        
        
    $context stream_context_create($opts);
        
    $contents file_get_contents("http://localhost:8888/CassaLaboratorio/mypage.php?datainizio=$datainizio&datafine=$datafine&operatore=1"false$context);

        
    $html $contents;
        
        
    // Nel caso in cui si voglia far scaricare il pdf nel pc client
        
    if ($mailValue == 'no'){
            
    $dompdf = new DOMPDF();
            
    $dompdf->set_paper("a4","portrait"); 
            
    $dompdf->set_base_path("stylesheet");
            
    $dompdf->load_html($html);
            
    $dompdf->render();
            
            
    $dompdf->stream("sample.pdf");
        }
        
        
    // Nel caso si voglia salvare il pdf nel server per un successivo utilizzo
        
    if ($mailValue =='yes'){
            
    $dompdf = new DOMPDF();
            
    $dompdf->set_paper("a4","portrait"); 
            
    $dompdf->set_base_path("stylesheet");
            
    $dompdf->load_html($html);
            
    $dompdf->render();

            
    $output 'tmp.pdf';

            
    $pdfoutput $dompdf->output(); 
            
    $filename $output
            
    $fp fopen($filename"a"); 
            
    fwrite($fp$pdfoutput); 
            
    fclose($fp);
        }
        
    // Ripristino manualmente i valori della sessione
        
        
    session_start();
        
    session_regenerate_id(TRUE);
        
        
    // Ricreo la sessione
        
    $user=htmlspecialchars('admin');
        
    $password=md5(htmlspecialchars('passwordAdmin'));
        
        
    $_SESSION['user'] = $user;
        
    $_SESSION['password'] = $password;
        
    } else {
        
    // Effettuo il redirect se il parametro mail è impostato in modo sbagliato
        
    header('location:index.php');
        exit;
    }
    ?>
    Se provo in qualunque modo a far partire la sessione prima del file_get_contents per salvarmi i parametri della sessione per poi riutilizzarli, mi viene generata in pdf la pagina che viene visualizzata quando non si è loggati. Altresì se uso
    Codice PHP:
    $userOperatore = require 'get_user.php'
    prima del file_get_contents accade la stessa cosa, cioè la pagina visualizzata è quella che si visualizza se non si è fatto l'accesso. Se invece lo uso dopo la pagina in pdf è corretta ma la sessione non è ripristinata.

    Non riesco a capirci più niente :confuse:

    Grazie ancora per l'aiuto e scusatemi per il post chilometrico!!!

  6. #6
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Sembra che il tuo problema sia questo:

    http://ar.php.net/manual/en/function...enerate-id.php

  7. #7
    Originariamente inviato da _debo
    Sembra che il tuo problema sia questo:

    http://ar.php.net/manual/en/function...enerate-id.php
    Grazie mille per la dritta!
    Inserendo
    Codice PHP:
    $userOperatore = require 'get_user.php'
    nella pagina che genera il pdf e rimuovendolo da mypage.php, rimuovendo anche i dati per il ripristino della sessione dalla pagina di generazione pdf, tutto il sistema funziona. Ecco il codice della pagina che genera i pdf:
    Codice PHP:
    <?php
    // Mi connetto al database
    require 'db_connect.php';

    // Includo la libbreria dompdf
    require_once("dompdf/dompdf_config.inc.php");

    // Trovo l'utente loggato
    $userOperatore = require 'get_user.php';
    $operatoreid $userOperatore['id'];

    // Solo l'utente 1 può vedere la pagina
    if ($operatoreid != 1) {
        
    header('location: index.php');
        exit();
    }

    // Trovo il valore dei cookie
    $myCookie $_SERVER['HTTP_COOKIE'];
      

    // Imposto i valori della data da visualizzare,
    // se nessuna data è selezionata imposta la data corrente.
    // Se invece la data di inizio è > alla data di fine le inverto.
    if (isset ($_GET['datainizio']) and isset ($_GET['datafine'])) {
        
    $datainizio $_GET['datainizio'];
        
    $datafine $_GET['datafine'];
        
    // Se $datainizio > $datafine inverto i valori.
        
    if ($datainizio $datafine) {
            
    $datatemp $datainizio;
            
    $datainizio $datafine;
            
    $datafine $datatemp;
        }
    } else {
        
    // Faccio il redirect
        
    header('location:index.php');
        exit;
    }

    // Controllo che la proprietà mail sia correttamente impostata 
    if (isset($_GET['mail']) AND (($_GET['mail'] == 'no') OR ($_GET['mail'] == 'yes'))){
        
        
    $mailValue $_GET['mail'];
        
    $opts = array('http' => array('header'=> 'Cookie: ' $myCookie ."\r\n"));
        
        
    $context stream_context_create($opts);
        
    $contents file_get_contents("http://localhost:8888/CassaLaboratorio/mypage.php?datainizio=$datainizio&datafine=$datafine&operatore=1"false$context);

        
    $html $contents;

        
    // Nel caso in cui si voglia far scaricare il pdf nel pc client
        
    if ($mailValue == 'no'){
            
    $dompdf = new DOMPDF();
            
    $dompdf->set_paper("a4","portrait"); 
            
    $dompdf->set_base_path("stylesheet");
            
    $dompdf->load_html($html);
            
    $dompdf->render();
            
            
    //To download pdf on client computer
            
    $dompdf->stream("sample.pdf");
        }
        
        
    // Nel caso si voglia salvare il pdf nel server per un successivo utilizzo 
        
    if ($mailValue =='yes'){
            
    $dompdf = new DOMPDF();
            
    $dompdf->set_paper("a4","portrait"); 
            
    $dompdf->set_base_path("stylesheet");
            
    $dompdf->load_html($html);
            
    $dompdf->render();

            
    $output 'tmp.pdf';

            
    $pdfoutput $dompdf->output(); 
            
    $filename $output
            
    $fp fopen($filename"a"); 
            
    fwrite($fp$pdfoutput); 
            
    fclose($fp);
        }
        
    } else {
        
    // Effettuo il redirect se il parametro mail è impostato in modo sbagliato 
        
    header('location:index.php');
        exit;
    }

    ?>
    e questo è il codice di mypage.php
    Codice PHP:
    <?php
    // Mi connetto al database
    require 'db_connect.php';

    // Importo la funzione per visualizzare la data nel formato italiamo d-m-Y
    require 'dataDisplayIta.php';

    // HO RIMOSSO IL CONTROLLO DELLA SESSIONE QUI
    /*
    // Trovo l'utente loggato
    $userOperatore = require 'get_user.php';
    $operatoreid = $userOperatore['id'];
    $operatorenome = $userOperatore['nome'];
    */

    $operatoreid $_GET['operatore'];

    // Solo l'utente 1 può vedere la pagina
    if ($operatoreid != 1) {
        
    header('location: index.php');
    }

    // Imposto i valori della data da visualizzare,
    // se nessuna data è selezionata imposta la data corrente.
    // Se invece la data di inizio è > alla data di fine le inverto.
    if (isset ($_GET['datainizio']) and isset ($_GET['datafine'])) {
        
    $datainizio $_GET['datainizio'];
        
    $datafine $_GET['datafine'];
        
    // Se $datainizio > $datafine inverto i valori.
        
    if ($datainizio $datafine) {
            
    $datatemp $datainizio;
            
    $datainizio $datafine;
            
    $datafine $datatemp;
        }
    } else {
        
    $datainizio date("Y-m-d");
        
    $datafine date("Y-m-d");
    }

    // Cambio il formato della data
    $datainizioIta data_it($datainizio);
    $datafineIta data_it($datafine);

    // Imposto il titolo della pagina    
    if ($datafine != $datainizio){
        
    $titolo "Cassa dal $datainizioIta al $datafineIta";
    } else {
        
    $titolo "Cassa del $datafineIta";
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <link href="style.css" rel="stylesheet" type="text/css" media="all" />
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <title><?php echo "$titolo"?></title>
        </head>
        <body>
            <div class="body">
    <?php
    L'ultima cosa che mi è rimasta da fare è capire ora che ho levato l'include da mypage.php come posso fare a far visualizzare la pagina solo all'operatore 1 senza usare
    Codice PHP:
    $operatoreid $_GET['operatore']; 
    visto che è facilmente aggirabile questo tipo di controllo da parte degli altri operatori.

    Grazie mille davvero _debo per l'aiuto!

  8. #8
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Beh direi che un modo per aggirare il problema è verificare che il session_id passato sia quello corretto, quindi, oltre a verificare l'id operatore verifica che il session_id sia quello che ti aspetti.

    Non è sicuro al 100% ma sfido quanti operatori sono in grado di fare un session hijacking.

  9. #9
    Originariamente inviato da _debo
    Beh direi che un modo per aggirare il problema è verificare che il session_id passato sia quello corretto, quindi, oltre a verificare l'id operatore verifica che il session_id sia quello che ti aspetti.

    Non è sicuro al 100% ma sfido quanti operatori sono in grado di fare un session hijacking.
    Perfetto! Grazie mille davvero per tutto l'aiuto che mi hai dato!

  10. #10
    Utente di HTML.it L'avatar di _debo
    Registrato dal
    Mar 2012
    residenza
    London, UK
    Messaggi
    858
    Figurati è un piacere per me.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.