Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003

    [classe] Sessioni su file XML

    Stavo pensando da tempo a qualcosa da sviluppare per potermi esercitare con le classi in php.
    Mi è venuto in mente di provare a creare un sistema alternativo alle sessioni.
    Sviluppando un'applicazione client-server in delphi che utilizzava come protocollo lo scambio di file xml, ho pensato di mettere i valori delle sessioni su un file xml salvato sul server.

    Quello che ne è uscito fuori è questo:
    Codice PHP:
    <?php
    class xmlSession {
     private  
    $id;
     private  
    $xmlContent;
     private  
    $file;
      
     public function 
    __construct() {
      if (isset(
    $_COOKIE['id'])) {
       
    $this->id $_COOKIE['id'];
      }
      else {
       
    $this->id md5(time());
       
    setcookie('id',$this->id);
      }
      
    $this->file './sessioni/'.$this->id.'.xml';
      if (
    file_exists($this->file)) {
       
    $this->xmlContent file_get_contents($this->file); 
      }
      else {
       
    $fp fopen($this->file,'w');
       
    fwrite($fp,'<sessione>'.chr(13).'</sessione>');
       
    fclose($fp);
       
    $this->xmlContent file_get_contents($this->file);
      }
      return 
    true;
     }

     public function 
    getValue($child) {
      if (
    $this->esistsValue($child)) {
       return 
    $args[0];
      }
      else {
       return 
    false;
      }
     }
     
     public function 
    setValue($child,$value) {
      if (
    $this->esistsValue($child)) {
       
    $this->xmlContent 

    eregi_replace('<'.$child.'>(.+)</'.$child.'>','<'.$child.'>'.$value.'</'.$child.'>',$this->xmlContent);
      }
      else {
       
    $this->xmlContent eregi_replace('<sessione>'.chr(13),'<sessione>'.chr(13).

    <'
    .$child.'>'.$value.'</'.$child.'>'.chr(13),$this->xmlContent);
      }  
      return 
    true;
     }
     
     public function 
    unsetValue($child) {
      if (
    $this->esistsValue($child)) {
       
    $this->xmlContent eregi_replace('<'.$child.'>(.+)</'.$child.'>'.chr(13),'',$this->xmlContent);
      }
      
    $this->saveXml(); 
      return 
    true;
     }
      
     public function 
    printXml() {
      echo 
    $this->xmlContent;
      return 
    true;
     }  
     
     private function 
    existsValue($child) {
      return 
    eregi('<'.$child.'>(.+)</'.$child.'>',$this->xmlContent);
     }
     
     private function 
    saveXml() {
      
    $fp fopen($this->file,'w');
      
    fwrite($fp,$this->xmlContent);
      
    fclose($fp);
      return 
    true;
     }

     public function 
    destroyXml() {
      
    unlink($this->file);
      
    setcookie('id');
      unset(
    $this->xmlContent);
     }

     public function 
    __destruct() {
      
    $this->saveXml();
      unset(
    $this->xmlContent);
     }
    }
    ?>
    Dato che però a casa non ho php 5 ho dovuto sviluppare la classe anche per php 4 da testare on line ed è uscito fuori questo:
    Codice PHP:
    <?php
    class xmlSession {
     var  
    $id;
     var  
    $xmlContent;
     var  
    $file;
      
     function 
    xmlSession() {
      if (isset(
    $_COOKIE['id'])) {
       
    $this->id $_COOKIE['id'];
      }
      else {
       
    $this->id md5(time());
       
    setcookie('id',$this->id);
      }
      
    $this->file './sessioni/'.$this->id.'.xml';
      if (
    file_exists($this->file)) {
       
    $this->xmlContent file_get_contents($this->file); 
      }
      else {
       
    $fp fopen($this->file,'w');
       
    fwrite($fp,'<sessione>'.chr(13).'</sessione>');
       
    fclose($fp);
       
    $this->xmlContent file_get_contents($this->file);
      }
      return 
    true;
     }

     function 
    getValue($child) {
      if (
    $this->esistsValue($child)) {
       return 
    $args[0];
      }
      else {
       return 
    false;
      }
     }
     
     function 
    setValue($child,$value) {
      if (
    $this->esistsValue($child)) {
       
    $this->xmlContent 

    eregi_replace('<'.$child.'>(.+)</'.$child.'>','<'.$child.'>'.$value.'</'.$child.'>',$this->xmlContent);
      }
      else {
       
    $this->xmlContent eregi_replace('<sessione>'.chr(13),'<sessione>'.chr(13).

    <'
    .$child.'>'.$value.'</'.$child.'>'.chr(13),$this->xmlContent);
      } 
      
    $this->saveXml(); 
      return 
    true;
     }

     function 
    unsetValue($child) {
      if (
    $this->esistsValue($child)) {
       
    $this->xmlContent eregi_replace('<'.$child.'>(.+)</'.$child.'>'.chr(13),'',$this->xmlContent);
      }
      
    $this->saveXml(); 
      return 
    true;
     }

     function 
    existsValue($child) {
      return 
    eregi('<'.$child.'>(.+)</'.$child.'>',$this->xmlContent);
     }

     function 
    printXml() {
      echo 
    $this->xmlContent;
      return 
    true;
     }  
     
     function 
    saveXml() {
      
    $fp fopen($this->file,'w');
      
    fwrite($fp,$this->xmlContent);
      
    fclose($fp);
      return 
    true;
     }
     
     function 
    destroyXml() {
      
    unlink($this->file);
      
    setcookie('id');
      unset(
    $this->xmlContent);
     }
    }
    ?>
    Dato che non sono praticissimo.. c'è qualcosa, a livello logico, di sbagliato in questo sistema?

  2. #2
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Ricontrollandoil codice, ho notato qualche errorino che ho corretto:
    Codice PHP:
    <?php
    class xmlSession {
     private  
    $id;
     private  
    $xmlContent;
     private  
    $file;
      
     public function 
    __construct() {
      if (isset(
    $_COOKIE['id'])) {
       
    $this->id $_COOKIE['id'];
      }
      else {
       
    $this->id md5(time());
       
    setcookie('id',$this->id);
      }
      
    $this->file './sessioni/'.$this->id.'.xml';
      if (
    file_exists($this->file)) {
       
    $this->xmlContent file_get_contents($this->file); 
      }
      else {
       
    $fp fopen($this->file,'w');
       
    fwrite($fp,'<sessione>'.chr(13).'</sessione>');
       
    fclose($fp);
       
    $this->xmlContent file_get_contents($this->file);
      }
      return 
    true;
     }

     public function 
    getValue($child) {
      return 
    $this->existsValue($child);
     }

     public function 
    setValue($child,$value) {
      if (
    $this->existsValue($child)) {
       
    $this->xmlContent eregi_replace('<'.$child.'>(.+)</'.$child.'>','<'.$child.'>'.$value.'</'.$child.'>',$this->xmlContent);
      }
      else {
       
    $this->xmlContent eregi_replace('<sessione>'.chr(13),'<sessione>'.chr(13).'<'.$child.'>'.$value.'</'.$child.'>'.chr(13),$this->xmlContent);
      }  
      return 
    true;
     }

     public function 
    unsetValue($child) {
      if (
    $this->existsValue($child)) {
       
    $this->xmlContent eregi_replace('<'.$child.'>(.+)</'.$child.'>'.chr(13),'',$this->xmlContent);
      }
      
    $this->saveXml(); 
      return 
    true;
     }
      
     public function 
    printXml() {
      echo 
    $this->xmlContent;
      return 
    true;
     }  

     private function 
    existsValue($child) {
      if (
    eregi('<'.$child.'>(.+)</'.$child.'>',$this->xmlContent,$args)) {
       return 
    $args[0];
      }
      else {
       return 
    false;
      }
     }

     private function 
    saveXml() {
      
    $fp fopen($this->file,'w');
      
    fwrite($fp,$this->xmlContent);
      
    fclose($fp);
      return 
    true;
     }

     public function 
    destroyXml() {
      
    unlink($this->file);
      
    setcookie('id');
      unset(
    $this->xmlContent);
     }

     public function 
    __destruct() {
      
    $this->saveXml();
      unset(
    $this->xmlContent);
     }
    }
    ?>

  3. #3

    Re: [classe] Sessioni su file XML

    Originariamente inviato da VaLvOnAuTa
    Dato che non sono praticissimo.. c'è qualcosa, a livello logico, di sbagliato in questo sistema?
    l'unica cosa che mi viene in mente e' che la sessione dovrebbe essere personale e metterla su un file xml pubblico, a livello di sicurezza, potrebbe non essere il massimo.

    Inoltre il tutto e' reso ancora piu' insicuro dal fatto che l'id di sessione viene creato da md5(time()), un hash facilmente replicabile e con molte possibilita' di essere sovrascritto, 2 utenti nello stesso secondo, casisticamente molto probabile, e addio sessione.

    Consiglio uniqueid e microtime, almeno la sessione viene resa meno facilmente riproducibile.

    Mi domando anche come faccia il client in delphi a salvarsi il cookie e ricordarsi della sessione, visto che a meno che non usi un browser al suo interno dubito che un applicativo desktop accetti cookies.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Il client in delphi non c'entra nulla col web... ho semplicemente notato che la lettura di un file xml da delphi è estremamente semplice ed ho pensato di sviluppare un sistema che potesse rendere altrettanto semplice la lettura e la scrittura di nodi.

    Per quanto riguarda la "sicurezza" in effetti l'hash del time() potrebbe comportare delle sovrapposizioni. Modificherò come suggerito

    Per quanto riguarda la facilità di accesso dei file xml, stavo vedendo se e come era possibile blindare la cartella in modo che non fosse accessibile.
    Immagino devo lavorare di .htaccess

  5. #5
    l' xml e la sua semplicita resi ancora piu' semplici da PHP5 non l'ho visto (SimpleXML tidice niente ?)


    mentre il time come sai e' facilmente cassinaro

    e il fatto di schiaffare sessioni su XML anche ... il databe e le sessioni su db, l'unica vera svolta/sicurezza, il resto e' una perdita di tempo poco affidabile/scalabile/sicura .... ma e' una mia idea
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Per carità... hai ragione tu... io volevo semplicemente "allenarmi" sulle classi, mica proponevo la mia idea come "sostitutiva" alle sessioni tradizionali o, peggio, a quelle su db di gm.
    Volevo semplicemente sapere se concettualmente la classe era stata sviluppata bene (possibilità di accorpare o scorporare metodi, inutili ridondanze di codice o cose del genere).

    simpleXML me lo devo studiare meglio anche se, come dice il nome, sembra estremamente semplice. Ma è un modulo solo per php5 o che si trova anche su versioni prededenti?

  7. #7
    alcune modifiche ... meno ridondanti ...
    codice:
    public function __construct() {
    	if(!isset($_COOKIE['id'] || !preg_match( "/^[a-f0-9]{32}$/", $_COOKIE['id']))
    		setcookie('id', md5( uniqid( microtime() ) ) );
    	$this->id = $_COOKIE['id'];
    	$this->file = './sessioni/'.$this->id.'.xml';
    	if(!file_exists( $this->file ) && (@$fp = fopen($this->file, 'w'))) {
    		fwrite($fp, '<sessione>'.chr(13).'</sessione>' );
    		fclose($fp);
    	}
    	$this->xmlContent = file_get_contents($this->file);
    } // return true ??? ... un costruttore non ritorna alcun dato ...
    
    
    public function setValue($child,$value) {
    	if( $this->existsValue($child) ) {
    		$find = "<{$child}>(.+)</{$child}>";
    		$replace = "<{$child}>{$value}</{$child}>";
    	}
    	else {
    		$find = '<sessione>'.chr(13),'<sessione>';
    		$replace = "<{$child}>{$value}</{$child}>".chr(13);
    	}
    	$this->xmlContent = eregi_replace( $find, $replace, $this->xmlContent);
    } // return true ??? ... e acosa serve se non fai controlli e sara' quindi sempre true ?
    
    
    private function existsValue($child) {
    	$result = false;
    	if (eregi('<'.$child.'>(.+)</'.$child.'>',$this->xmlContent,$args))
    		$result = $args[0];
    	return $result;
    } // 1 solo return a funzione, più pulito

    poi userei preg al posto di qualunque eregi (più potente e più veloce) ed eliminerei ogni return true da qualunque metodo, non serve a niente scrivere return true perchè il true così facendo sarà sempre vero, quindi l' if sarà sempre superfluo.
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Utente di HTML.it L'avatar di VaLvOnAuTa
    Registrato dal
    Jun 2002
    Messaggi
    2,003
    Tnx in particolare per la pazienza

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.