Visualizzazione risultati 1 fino 16 di 16
Like Tree1Likes
  • 1 Post By karl94

Discussione: Proteggere file di una directory con login PHP

  1. #1
    Guest

    Lightbulb Proteggere file di una directory con login PHP

    Salve a tutti,

    Vi descrivo la mia situazione:
    Nel mio sito ho una cartella /private che contiene un mini-sito accessibile solo tramite password.
    Ho già creato una pagina di login (/private/index.php) che permette il login ed ogni pagina contenuta nella cartella /private non è accessibile se non si è effettuato il login.

    Ho notato però che le immagini contenute in /private/image possono essere ovviamente visualizzate da chiunque abbia il link diretto alle immagini. Ora vorrei che le immagini contenute in tale directory (o anche tutti i file contenuti in /private) fossero accessibili solo a chi ha eseguito il login.

    Avevo pensato alcune possibilità tra cui:
    • Creare uno script PHP che individuasse l'indirizzo IP di chi effettua il login e modificasse il file .htaccess di conseguenza; so che non è molto sicuro ma per quello che c'è in quella directory è sufficiente.
    • Impostare il file .htaccess della directory /private/image su "deny from all" e creare uno script che però consenta la visualizzazione delle immgini nelle pagine web perchè se uso 'echo <img src="http://forum.it.altervista.org/php-mysql-e-apache-htaccess/php-mysql-e-apache-htaccess/....">' non me le lascia visualizzare.
    • Oppure se esiste un altro modo per impedire l'accesso a una directory (completamente, a qualsiasi files contenuto) a meno che non si effettui il login.


    In sostanza vorrei un modo per proteggere con un login PHP anche tutti i files non-PHP per i quali non posso inserire il controllo della sessione!

    Il problema è che non so mettere in pratica nessuna delle mie idee...
    Mi servirebbe il vostro aiuto! Grazie anticipatamente!!
    Ultima modifica di engine5 : 29-01-2014 alle ore 23.07.01

  2. #2
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Ciao,
    per proteggere tutti i files in una directory con username e password puoi utilizzare .htaccess accedendo alla directory /private e cliccando sul lucchetto che trovi in gestione files dal pannello di altervista.

    Alternativamente, se vuoi fare tutto con PHP, devi fare in modo con il mod_rewrite che tutte le immagini o i files NON PHP vengano riscritti ad una pagina PHP che dopo aver controllato se l'utente è loggato o meno assumerà (o meno) l'header content del file riscritto ed eventualmente diventerà lui l'immagine.

    EDIT: forse non mi sono spiegato bene, ma è più facile a farsi che a dirsi Prova con .htaccess se poi vuoi usare PHP ti aiuto.
    Apprezzi l'aiuto? Offrimi un caffè!

  3. #3
    Guest

    Lightbulb

    Citazione Originalmente inviato da miki92 Visualizza messaggio
    Ciao,
    per proteggere tutti i files in una directory con username e password puoi utilizzare .htaccess accedendo alla directory /private e cliccando sul lucchetto che trovi in gestione files dal pannello di altervista.

    Alternativamente, se vuoi fare tutto con PHP, devi fare in modo con il mod_rewrite che tutte le immagini o i files NON PHP vengano riscritti ad una pagina PHP che dopo aver controllato se l'utente è loggato o meno assumerà (o meno) l'header content del file riscritto ed eventualmente diventerà lui l'immagine.

    EDIT: forse non mi sono spiegato bene, ma è più facile a farsi che a dirsi Prova con .htaccess se poi vuoi usare PHP ti aiuto.
    Grazie per la risposta,
    Volevo evitare di utilizzare il basic login dell'htaccess, ero più interressato a farlo in PHP così potevo sfruttare la pagina di login che già ho.

    Da quello che ho capito bisognerebbe abbinare ad ogni file non-PHP una pagina PHP contenente il file stesso e questo dovrebbe essere fatto nel .htaccess con la funzione mod_rewrite;
    Quindi ad esempio potrei creare una cartella /private/imagePHP (che sarà pubblica) dove verranno mesi tutti i files PHP che "reindirizzano" alle immagini che necessitano di login (apponendo l'apposito codice di verifica di login in ogni pagina) mentre le immagini "originali" potranno stare nella /private/image (con .htaccess deny from all).

    Giusto? E in caso come si crea una pagina PHP di quel tipo? E come dovrei modificare l'htaccess?

    Edit: se può servire io adesso per controllare che un utente sia loggato uso questo:

    Codice PHP:
    <?php
    session_start
    ();
    if (!isset(
    $_SESSION['login'])) {
    header("Location: index.php");
    }
    ?>
    Ultima modifica di engine5 : 30-01-2014 alle ore 15.26.50

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,145

    Predefinito

    Io farei così:

    Metterei le immagini sulla cartella protetta da accesso diretto (con .htaccess deny from all). Questi però possono essere raggiunti da script. Quindi fai uno script che forza il download delle immagini con un "download forzato". Lì dentro controlli se l'utente è loggato o meno.

    Ciao!

  5. #5
    Guest

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Io farei così:

    Metterei le immagini sulla cartella protetta da accesso diretto (con .htaccess deny from all). Questi però possono essere raggiunti da script. Quindi fai uno script che forza il download delle immagini con un "download forzato". Lì dentro controlli se l'utente è loggato o meno.

    Ciao!
    Grazie per la risposta,
    Ho capito quello che intendi, ma così facendo credo che si possano solo scaricare le immagini dal sito, mentre io vorrei poterle includere nelle pagine web, ma che non siano accessibili se qualcuno scrive nella barra degl indirizzi il link diretto.
    Avevo già provato ad usare PHP con "echo <img src....>" ma non me lo lasciava fare ugualmente se imposto "deny from all" alla cartella delle immagini (non si visualizzano).
    Sostanzialmente quello che mi servirebbe è uno script come quello da te descritto che invece di lasciarle scaricare solo se sei autenticato le visualizza (in una pagina PHP) solo se sei autenticato, permettendomi quindi di settare il "deny from all" alla directory delle immagini.

    Spero di essermi spiegato bene...
    Ultima modifica di engine5 : 30-01-2014 alle ore 16.44.08 Motivo: sintassi

  6. #6
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,145

    Predefinito

    Ah, allora un modo potrebbe essere quello di "creare" l'immagine tramite PHP: tieni le immagini salvate nella cartella protette da .htaccess come detto sopra, ma le mostri tramite uno script PHP.

    Codice PHP:
    <?php
    session_start
    ();
    if(!isset(
    $_SESSION['login']))
    {
    header('Location:errore.html'); //errore
    }

    $dir_img = './immagini/';
    if(isset(
    $_GET['immagine']) && file_exists($dir_img.$_GET['immagine']) )
    {
    $im = imagecreatefrompng($dir_img.$_GET['immagine']);
    header('Content-Type: image/png');
    imagepng($im);
    var_dump($im);
    imagedestroy($im);
    }
    else echo
    'Richiesta errata!';
    ?>
    Mi scuso per averti dato il codice già fatto (e di averti tolto il divertimento ), ma l'ho fatto per spiegar meglio possibile. Comunque dovresti migliorarlo ad esempio per far supportare altri tipi di immagini, e non solo PNG!

    Ciao!
    Ultima modifica di alemoppo : 30-01-2014 alle ore 17.06.07

  7. #7
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Ma in realtà non serve scomodare le librerie GD, è sufficiente leggere il contenuto del file e sputarlo fuori. Un banale echo con fileGetContents è più che sufficiente. Ovviamente bisogna prestare attenzione a non permettere ad un malintenzionato di leggere un qualsiasi file presente nello spazio web, dunque bisogna fare uno o due controlli sul percorso che viene fornito allo script.
    alemoppo likes this.

  8. #8
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Difatti la soluzione che intendevo io (e che uso su un altro sito) poteva essere questa:

    .htaccess
    Codice PHP:
    RewriteRule ^(.*)\.(png|jpg|jpeg)$ immagini.php?img=$1.$2 [L]
    immagini.php
    Codice PHP:
    /*
    SCRIPT CONTROLLO LOGIN
    */

    $img = $_GET['img'];

    echo
    file_get_contents($img);
    Ovviamente vanno fatti controlli e filtri sul valore GET
    Apprezzi l'aiuto? Offrimi un caffè!

  9. #9
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,145

    Predefinito

    Beh, immagino però che vada comunque modificato il "type" del file nell'header, no?

    Ciao!

  10. #10
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Sì, certamente è sempre bene fornire la risorsa con il MIME type corretto.

  11. #11
    Guest

    Thumbs up

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Ah, allora un modo potrebbe essere quello di "creare" l'immagine tramite PHP: tieni le immagini salvate nella cartella protette da .htaccess come detto sopra, ma le mostri tramite uno script PHP.

    Codice PHP:
    <?php
    session_start
    ();
    if(!isset(
    $_SESSION['login']))
    {
    header('Location:errore.html'); //errore
    }

    $dir_img = './immagini/';
    if(isset(
    $_GET['immagine']) && file_exists($dir_img.$_GET['immagine']) )
    {
    $im = imagecreatefrompng($dir_img.$_GET['immagine']);
    header('Content-Type: image/png');
    imagepng($im);
    var_dump($im);
    imagedestroy($im);
    }
    else echo
    'Richiesta errata!';
    ?>
    Mi scuso per averti dato il codice già fatto (e di averti tolto il divertimento ), ma l'ho fatto per spiegar meglio possibile. Comunque dovresti migliorarlo ad esempio per far supportare altri tipi di immagini, e non solo PNG!

    Ciao!
    Citazione Originalmente inviato da karl94 Visualizza messaggio
    Ma in realtà non serve scomodare le librerie GD, è sufficiente leggere il contenuto del file e sputarlo fuori. Un banale echo con fileGetContents è più che sufficiente. Ovviamente bisogna prestare attenzione a non permettere ad un malintenzionato di leggere un qualsiasi file presente nello spazio web, dunque bisogna fare uno o due controlli sul percorso che viene fornito allo script.
    Citazione Originalmente inviato da miki92 Visualizza messaggio
    Difatti la soluzione che intendevo io (e che uso su un altro sito) poteva essere questa:

    .htaccess
    Codice PHP:
    RewriteRule ^(.*)\.(png|jpg|jpeg)$ immagini.php?img=$1.$2 [L]
    immagini.php
    Codice PHP:
    /*
    SCRIPT CONTROLLO LOGIN
    */

    $img = $_GET['img'];

    echo
    file_get_contents($img);
    Ovviamente vanno fatti controlli e filtri sul valore GET
    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Beh, immagino però che vada comunque modificato il "type" del file nell'header, no?

    Ciao!

    Visti tutti i vostri suggerimenti sono riuscito a creare ciò che volevo.
    Ho creato solamente una pagina PHP image.php che "reindirizza" alle immagini (JPEG) contenute nella cartella ./images/ (con .htaccess "Deny from all") solo se si è loggati al sito.

    Ecco il risultato:

    image.php
    Codice PHP:
    <?php
    /* Verifica Login */
    session_start();
    if(!isset(
    $_SESSION['login']))
    {
    header('Location:/errors/403.htm');
    }

    /* Recupero Immagine */
    if(isset($_GET['img']))
    {
    $dir_img = './images/';
    if (
    file_exists($dir_img.$_GET['img']))
    {
    $img = $dir_img.$_GET['img'];

    header('Content-Type: image/jpeg');
    echo
    file_get_contents($img);
    }
    else echo
    'PHP Image Error: FILE missing';
    }
    else echo
    'PHP Image Error: GET missing!';
    ?>
    Per "rimandare" ad un'immagine basta richiamare image.php?img=nome_immagine.jpg

    Grazie a tutti!
    Ultima modifica di engine5 : 02-02-2014 alle ore 01.55.46 Motivo: repetition

  12. #12
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,744

    Predefinito

    Sì, ma devi controllare ciò che viene passato dall'esterno, cosa accadrebbe se uno usasse come URL image.php?img=../image.php? Un malintenzionato potrebbe ottenere il contenuto di tutti gli script PHP (così come degli altri file) presenti nello spazio web, cercare magari vulnerabilità presenti negli stessi e sfruttarle.
    Un attacco di questo tipo viene detto Path traversal, un modo per proteggersi potrebbe essere quello suggerito qua: http://stackoverflow.com/questions/4...answer-4205278.

  13. #13
    Guest

    Predefinito

    Citazione Originalmente inviato da karl94 Visualizza messaggio
    Sì, ma devi controllare ciò che viene passato dall'esterno, cosa accadrebbe se uno usasse come URL image.php?img=../image.php? Un malintenzionato potrebbe ottenere il contenuto di tutti gli script PHP (così come degli altri file) presenti nello spazio web, cercare magari vulnerabilità presenti negli stessi e sfruttarle.
    Un attacco di questo tipo viene detto Path traversal, un modo per proteggersi potrebbe essere quello suggerito qua: http://stackoverflow.com/questions/4...answer-4205278.
    Grazie, modificato di conseguenza:

    image.php
    Codice PHP:
    <?php
    /* Verifica Login */
    session_start();
    if(!isset(
    $_SESSION['login']))
    {
    header('Location:/errors/403.htm');
    }

    /* Recupero Immagine */
    if(isset($_GET['img']))
    {
    $dir_img = './images/';
    $img_path = $dir_img . $_GET['img'];
    $real_dir_img = realpath($dir_img);
    $real_img_path = dirname(realpath($img_path));

    if (
    $real_img_path===$real_dir_img && $real_img_path==true && file_exists($img_path))
    {
    header('Content-Type: image/jpeg');
    echo
    file_get_contents($img_path);
    }
    else echo
    'PHP Image Error: PATH or FILE missing';
    }
    else echo
    'PHP Image Error: GET missing!';
    ?>
    E visto che ci siamo, non è che c'è qualche falla di sicurezza nello script di login?

    index.php
    Codice PHP:
    <?php
    session_start
    ();
    $password="ciao";
    if (isset(
    $_SESSION['login'])) {
    if (isset(
    $_POST['logout'])) {
    unset(
    $_SESSION['login']);
    $messaggio = "Logout successfully!";
    } else {
    header("Location: page.php");
    }
    } else {
    if (isset(
    $_POST['password'])) {
    if (
    $_POST['password'] == $password) {
    $_SESSION['login'] = "Login effettuato!";
    header("Location: page.php");
    } else {
    $messaggio = "ACCESS DENIED! INVALID PASSWORD!";
    }
    }
    }
    ?>
    Grazie ancora!
    Ultima modifica di engine5 : 02-02-2014 alle ore 17.48.40 Motivo: login added

  14. #14
    al3dv non è connesso Neofita
    Data registrazione
    19-12-2012
    Messaggi
    8

    Question

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Io farei così:

    Metterei le immagini sulla cartella protetta da accesso diretto (con .htaccess deny from all). Questi però possono essere raggiunti da script. Quindi fai uno script che forza il download delle immagini con un "download forzato". Lì dentro controlli se l'utente è loggato o meno.

    Ciao!
    ciao alemoppo, io dovrei fare proprio questo lavoro:
    impedire a chiunque dall'esterno di accedere ai file contenuti sotto una certa directory del mio sito.

    ho modificato il file .htaccess inserendo "deny from all".

    fino a qui tutto bene, i file non vengono piu aperti.

    adesso vorrei far scaricare gli stessi file solo dagli utenti registrati al mio sito (dopo essersi loggati).

    saresti cosi gentile di darmi due dritte su come fare questo ultimo step?
    avresti un esempio di script da usare?

    grazie ancora e buon lavoro

  15. #15
    L'avatar di miki92
    miki92 non è connesso AlterGuru 2500
    Data registrazione
    21-04-2007
    Residenza
    Procida (NA)
    Messaggi
    4,226

    Predefinito

    Citazione Originalmente inviato da alemoppo Visualizza messaggio
    Beh, immagino però che vada comunque modificato il "type" del file nell'header, no?

    Ciao!
    Citazione Originalmente inviato da karl94 Visualizza messaggio
    Sì, certamente è sempre bene fornire la risorsa con il MIME type corretto.
    In realtà usando .htaccess come rewrite non ci sarebbe bisogno di specificare il MIME/TYPES in quanto i browser automaticamente interpretano l'estensione del file o comunque PHP interpreta il content-type del file automaticamente quando lo mostra tuttavia aggiungerlo non fa mai male.

    Citazione Originalmente inviato da al3dv Visualizza messaggio
    ciao alemoppo, io dovrei fare proprio questo lavoro:
    impedire a chiunque dall'esterno di accedere ai file contenuti sotto una certa directory del mio sito.

    ho modificato il file .htaccess inserendo "deny from all".

    fino a qui tutto bene, i file non vengono piu aperti.

    adesso vorrei far scaricare gli stessi file solo dagli utenti registrati al mio sito (dopo essersi loggati).

    saresti cosi gentile di darmi due dritte su come fare questo ultimo step?
    avresti un esempio di script da usare?

    grazie ancora e buon lavoro
    Questo può esserti molto utile. Devi solamente aggiungere prima di questo script un controllo per verificare se l'utente è loggato o meno.
    Apprezzi l'aiuto? Offrimi un caffè!

  16. #16
    al3dv non è connesso Neofita
    Data registrazione
    19-12-2012
    Messaggi
    8

    Predefinito

    Citazione Originalmente inviato da miki92 Visualizza messaggio
    In realtà usando .htaccess come rewrite non ci sarebbe bisogno di specificare il MIME/TYPES in quanto i browser automaticamente interpretano l'estensione del file o comunque PHP interpreta il content-type del file automaticamente quando lo mostra tuttavia aggiungerlo non fa mai male.



    Questo può esserti molto utile. Devi solamente aggiungere prima di questo script un controllo per verificare se l'utente è loggato o meno.

    grazie mille, sei un grande!

    funziona tutto come si deve ;-)

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •