Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    Richiesta parere: il template in php rivisto

    Un saluto a tutti. Sono Alessandro Fulciniti, l' autore dell' articolo sul template in PHP di PRO (ora sospeso per revisione) di cui si è parlato anche qui in un paio di thread. La questione è che ero all' oscuro della possibilità di includere pagine remote attraverso la variabile get.
    Entro breve verrà pubblicato l' articolo con una rettifica e il codice rivisto. Mi sono documentato un po' in rete e in una mailing list. La soluzione che vorrei adottare dovrebbe essere piuttosto sicura ma anche a prova di newbie di php, così vorrei chiedere un parere. Ecco il codice di index.php rivisto:

    Codice PHP:
    <? include("header.php");
    include(
    "menu.php");
    $p="main.php";  //pagina di default per i contenuti centrali
    if(isset($_GET['page'])){   //pagina passata via parametro
        
    $p=substr($_GET['page'],30);
        if(
    preg_match("#^[a-z0-9_]+$#i",$p) && $p!="index" && file_exists($p.".php"))
            
    $p=$p.".php";
        else
            
    $p="error.php";     //pagina di errore
        
    }
    include(
    $p);
    include(
    "footer.php"); ?>
    Introducendo il vincolo che la variabile x l' inclusione contenga solo lettere e numeri, che non sia lunga + di trenta caratteri e che l' estensione ".php" venga aggiunta da php stesso, e che il file sia nella root si dovrebbe essere abbastanza sicuri.

    Inoltre, ho notato che se index include index il browser (e immaginio anche il server) va in crash, quindi ho aggiunto anche la verifica su index.

    So che una tra le soluzioni più sicure è elencare in un array le pagine ammesse per l' inclusione, ma risulta a parer mio poco pratica, soprattutto le pagine sono molte.

    Grazie in anticipo a chi vorrà intervenire.

    Alessandro Fulciniti

  2. #2
    sicuro che questo permette di includere pagine remote? a me sembra una normale inclusione con qualche controllo...

  3. #3
    piu' sicura, piu' veloce, meno limiti
    codice:
    $p = 'main';
    if( isset( $_GET['page'] ) == true && $_GET['page'] != $p ) {
        $p = &basename( $_GET['page'] );
        if( file_exists( $p.'.php' ) == false )
            $p = 'error';
    }
    include($p.'.php');

    oppure, come e' mia abitudine fare, con path per la sottodirectory ( trovo piu' comodo racchiudere le sezioni in una cartella a parte per non rendere disordinato l' ftp in apertura root )
    codice:
    $sectionFolder = 'sections/';
    $p = 'main';
    if( isset( $_GET['page'] ) == true && $_GET['page'] != $p ) {
        $p = &basename( $_GET['page'] );
        if( file_exists( $sectionFolder.$p.'.php' ) == false )
            $p = 'error';
    }
    include($sectionFolder.$p.'.php');

    oppure, prendendo come esempio la struttura in sottocartella e valutando l' opzione sezione in array [ dinamica,senza creare l' array a mano ] ...

    codice:
    $sectionFolder = 'sections/';
    if( $handle = &opendir( $sectionFolder ) ) {
        $sections = Array();
        while( false !== ( $file = &readdir( $handle  ) ) ) {
            if( array_pop( explode( '.', $file ) ) == 'php' ) {
                array_push( $sections, substr( $file, 0, -4 ) );
            }
        }
        if( isset( $_GET['page'] ) == false || $_GET['page'] == 'main' ) {
            $_GET['page'] = 'main';
        }
        elseif( in_Array( $_GET['page'], $sections ) == false ) {
            $_GET['page'] = 'error';
        }
        include($sectionFolder.$_GET['page'].'.php');
    }
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    VVoVe: ma questo metodo va anche se gli include remoti sono disabilitati?

  5. #5
    [supersaibal]Originariamente inviato da mdsjack
    VVoVe: ma questo metodo va anche se gli include remoti sono disabilitati? [/supersaibal]
    Uhmm.. ora che ci penso forse mi sono spiegato male io.. la questione è che, per ovvi motivi di sicurezza, il template *non* deve poter includere file remoti.
    Grazie anche ad Andr3a per le tre soluzioni proposte.. una cosa non mi è chiara: come mai la "&" davanti a basename?

    Saluti,
    Alessandro Fulciniti

  6. #6
    [supersaibal]Originariamente inviato da Fulciniti
    come mai la "&" davanti a basename?
    [/supersaibal]
    vizio personale ed eccesso di ottimizzazione, assegno per riferimento e non copio la variabile
    la puoi tranquillamente omettere in tutti i codici
    [ io pero' avrei scritto cosi' ]
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  7. #7
    [supersaibal]Originariamente inviato da andr3a
    vizio personale ed eccesso di ottimizzazione, assegno per riferimento e non copio la variabile
    la puoi tranquillamente omettere in tutti i codici
    [ io pero' avrei scritto cosi' ] [/supersaibal]
    php5 non lo farà di default? :master:

  8. #8
    [supersaibal]Originariamente inviato da mdsjack
    php5 non lo farà di default? :master: [/supersaibal]
    php5 si comporta in modo un po' particolare ... o meglio, si comporta come il 4 dovrebbe comportarsi, se fai un loop tipo questo:

    codice:
    <?php // 5
    $a = 0;
    $pippo = Array();
    while( $a < 10 ) {
        $pippo[$a] = &$a;
        $a++;
    }
    echo $pippo[0]; // 10
    ?>
    tutti i pippo avranno fatto riferimento ad $a ed essendo $a 10, qualunque $pippo[N] sara' 10

    semplicemente perfetto
    [ quindi non lo fa di default, o meglio, di default fa un riferimento poi se usi la & non te lo perdi piu' ]
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  9. #9

    Grazie a tutti

    Ciao,
    Volevo ringraziare tutti per gli interventi, in particolare Andr3a per le soluzioni proposte nell' altro thread e Saibal per aver riaperto questo. Grazie anche a chi, con dei commenti un po' pesanti, ha evidenziato la cosa sia sul sito che qui sul forum. Senza di essi, l' articolo incriminato con l' esempio sarebbe ancora on-line... come potenziale minaccia per html.it e per i lettori che l' avrebbero adottato.

    Davvero sono cose che non conoscevo, ed è stata una leggerezza imperdonabile. Credo che a breve verrà ripubblicato, con le mie scuse e la nuova versione. In quanto alla soluzione che ho pensato di adottare e che ha postato Saibal, il fatto è che il punto essenziale dell' articolo è la separazione tra struttura (php) contenuto (html) e presentazione (css). Voleva fornire una piccola soluzione pratica a chi di php non è pratico e pensa ancora che i frame siano l' unica soluzione per gestire facilmente un sito e le tabelle l' unico modo di impaginarlo.

    Se qualcuno ha letto qualche mio articolo, sa che mi occupo principalmente di CSS, javascript e affini... per preparare la serie di articoli sul template in PHP ho dovuto studiare, ma si vede che non ho studiato abbastanza...

    Tornando allo script: a questo punto la cosa essenziale è avere un minimo di sicurezza, pur introducendo il vincolo che i file php inclusi siano nella root. D' altronde, pro.html.it non è mai stato terreno di PHP e la serie, per come è stata pensata, è più vicina al webdesign che al PHP stesso.

    Se posso chiedere ancora una cosa... non ho capito la questione sulla possibilità di includere pagine remote ma che stanno sullo stesso hard disk.

    Grazie ancora a tutti... e se doveste avere difficoltà con i CSS, non esitate a scrivermi.

    Saluti,
    Alessandro Fulciniti

  10. #10
    hai sbagliato tasto


    ---

    php supporta la possibilità, tramite gli stream, di utilizzare dei "sistemi" diversi per leggere dei file

    a php gli si dice di usare uno stream o un altro...tramite le funzioni per la gestione dei file

    quando fai fopen('ciccio.txt') lui in auto usa file... ma se fai fopen('http://www.ciccio.it/index.html'); lui sa che deve usare lo stream HTTP perché la stringa che passi inizia con HTTP://

    siccome TUTTE le funzioni che lavorano con i file li supportano anche include e require (e corrispettivi _once) gestiscono gli stream

    quindi se l'hoster ha abilitato fopen_allow_url (è moltissimi lo fanno) è possibile passare un http://www.miosito.it/tests/pagina.php che viene inclusa nella tua pagina...
    per la precisione viene incluso quello che viene restituito...quindi devi fare stampare una pagina php...ad es echo "<?php echo \"test\"; ?>"; e ti verrà stampato al momento dell'include test

    sciauz
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

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.