Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    54

    Aiuto riscrivere file con fwrite

    Ciao ragazzi, ho esigenza di aggiungere delle righe dopo un determinato carattere ad esempio:

    codice:
    [...]
    <?php
    nuovo contenuto prima della graffa
    }
    ?>
    [...]
    Ho smanettato molto con fseek,ftell,fwrite ma non ho risolto niente.

    Allora ho pensato di riscrivere l'intero file suddividendolo in 3 parti ovvero:

    codice:
    -Contenuto vecchio
    -Contenuto nuovo
    -Chiusura file
    Dove il contenuto vecchio contiene tutte le istruzioni di switch($pagina), il contenuto nuovo e' quello che aggiungo io tramite un form, la chiusura del file non contiene altro che } ?>

    Il problema dov'e' ?

    Il problema nasce quando nell' Fwrite inserisco il contenuto vecchio (codice PHP) nella variabile $contenuto in questo modo:

    codice:
    $contenuto = "<?php switch($pagina) ecc... ?>"
    Come faccio a far scrivere codice PHP, da una pagina PHP??? cioe' appena chiudo ?> nasce il problema e' ovvio che lo riconosce come codice PHP della medesima pagina, ma non quella da aggiornare....

    Aiuto please, sto diventando pazzo da 3 giorni....

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    soffermandosi sull'ultimo punto che mi pare sia il problema fondamentale, puoi semplicemente fare così:

    $ot = '<'.'?php';
    $ct = '?'.'>';

    $rigacodicephp = "$ot ...codicephpchevuoi... $ct";

    o qualcosa del genere.

  3. #3
    Non ho capito bene qual e' il problema, posta il codice che hai usato.

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    54
    tranquilli ho risolto in altro modo ...

    Per risolvere, a inizio pagina ho usato:

    codice:
    $pagina = htmlspecialchars($_GET['pagina']);
    e al centro della pagina interessata ho usato:

    codice:
    <?php
    $cartella = "pagine/";  
    include("$cartella" . "$pagina.php");
    ?>
    Cosi quando l'amministratore crea una pagina, non c'e' bisogno di creare una variabile con switch($pagina) { case blah blah ....

    @k.b.: il problema era che non riuscivo a scrivere codice PHP tramite fwrite in un altro file...

  5. #5
    Sconsiglio vivamente questo approccio in quanto estremamente insicuro. Chiunque tramite query string puo' farti includere praticamente qualunque file voglia, anche in altre directory (ad esempio chiamando pagina.php?pagina=../../../etc/passwd o simile).

    Usa *almeno* la funzione basename() per assicurarti che $pagina contenga solo un nome di file e non un percorso completo.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2004
    Messaggi
    3,709
    Originariamente inviato da zio_hc
    @k.b.: il problema era che non riuscivo a scrivere codice PHP tramite fwrite in un altro file...
    ma neanche con l'esempio che ti ho mandato?

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    54
    eiyen non ho ancora provato, ho letto dopo che ho adottato questo metodo la tua gentile risposta!

    @k.b. si lo so che e' insicuro, sono nel campo... ho sviluppato un firewall apposta che controlla le variabili e in caso di LFI,XSS,SQLi o RFI restituisce un messaggio d'errore!

    Grazie

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    54
    Originariamente inviato da k.b
    Sconsiglio vivamente questo approccio in quanto estremamente insicuro. Chiunque tramite query string puo' farti includere praticamente qualunque file voglia, anche in altre directory (ad esempio chiamando pagina.php?pagina=../../../etc/passwd o simile).

    Usa *almeno* la funzione basename() per assicurarti che $pagina contenga solo un nome di file e non un percorso completo.
    Comunque accetto esempi eh non si finisce mai di imparare ;-)
    Grazie!

  9. #9
    L'inclusione di file e' un punto delicato in uno script, e' facile creare buchi di sicurezza se non si fa attenzione. Il modo migliore per evitare problemi e' che sia lo sviluppatore a scrivere direttamente quali sono i file accettabili, cosi' si e' sicuri che nulla di imprevisto possa succedere. Quando questo non e' possibie, bisogna cercare di confinare il raggio d'azione dell'include il piu' possibile. Usando una directory fissa scritta direttamente nel codice e basename() in questo modo:

    codice:
    $directory = '/var/www/includes/';
    $page = basename($_GET['page']);
    
    include($directory . $page);
    ti assicuri che possano essere inclusi solo file da quella specifica directory. Un approccio ancora migliore e' verificare che il nome del file sia valido e non contenga caratteri strani: ad esempio se usi solo caratteri alfanumerici e underscore puoi verificare con:

    codice:
    if (preg_match('#^[a-z0-9_.]+$#', $page)) {
    	// nome ok
    } else {
    	// nome non ok
    }
    o ancora controllare l'estensione del file o qualunque altro controllo si addica alla situazione.

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    54
    OK chiarissimo grazie!

    Avrei bisogno un aiutino sul formulare meglio l'inclusione con controlli vari ecc... saresti cosi gentile da aiutarmi a creare un blocco sicuro ed efficente?
    Questo e' quello che vorrei fare, ecco lo pseudo codice:

    codice:
    <?php
    - se $_GET['pagina'] e' vuoto
    - includo homepage.php
    - altrimenti controllo l'inclusione
    - includo pagine/$pagina.php
    ?>
    Questo e' il mio codice attuale, ma non controlla tutto ancora, non sono esperto quindi meglio il tuo parere che il mio

    codice:
    <?php
    if ($pagina == NULL) {
    include('pagine/homepage.php');
    }
    else {
    $cartella = "pagine/";  
    include("$cartella" . "$pagina.php");  
    } 
    ?>

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.