File accessibile solo da codice

di il
9 risposte

File accessibile solo da codice

Buongiorno,
non sono sicuro fino a che punto la mia domanda abbia a che fare con il php:
vorrei che un certo file che carico su una cartella personalizzata del mio spazio web sia leggibile solo dal codice php che lo richiama e non anche ad eventuali utenti che vi accedono digitando il suo url sul web.
Questo perché il file contiene informazioni che filtro di volta in volta in base all'utente loggato.
Per quel che valga, l'incipit del mio codice è il seguente:
 
 function funz_shortcode() {

$rows = array_map(function($v){return str_getcsv($v, "|");}, file('https://url_file.csv'));
$header = array_shift($rows);
$csv = [];
foreach($rows as $row) {
$csv[] = array_combine($header, $row);
}

[... continua ...]
Ho un sito Wordpress con host Aruba.
Qualche suggerimento?
Grazie in anticipo.

9 Risposte

  • Re: File accessibile solo da codice

    Io farei in questo modo:
    Nella cartella dei downloads, dove c’è il file da scaricare, crea un file .htaccess che contenga il seguente codice:

    Order Deny,Allow
    Deny from all

    Sempre nella stessa cartella crea un file php e punta l’url per il download a questo file, quindi all’interno del file metti un if statement per controllare se l’utente è loggato, se lo è forza il download del file utilizzando gli headers, qui trovi una guida su come fare https://www.tutorialspoint.com/how-to-force-file-download-with-php
  • Re: File accessibile solo da codice

    Grazie mille del contributo, sono sulla buona strada.
    Purtroppo ho un intoppo.
    Prima ancora di creare il file .htaccess non riesco a far funzionare sul mio index.php creato nella stessa cartella del file da scaricare l'if statement relativo al controllo che verifica se l'utente è loggato.
    
    <?php
    if ( is_user_logged_in() ) {
        echo 'Welcome, registered user!';
    } else {
        echo 'Welcome, visitor!';
    }
    ?>
    
    Ricevo questo errore stampato sulla pagina:
    
    Fatal error: Uncaught Error: Call to undefined function is_user_logged_in() in /web/htdocs/www.miosito.it/home/test2/index.php:2 Stack trace: #0 {main} thrown in /web/htdocs/www.miosito.it/home/test2/index.php on line 2
    
  • Re: File accessibile solo da codice

    Ciao,scusa non mi ero accoto che stai utilzzando WordPress. Ricevi questo errore perchè essendo un file esterno devi prima assicurare che WordPress stesso e quindi tutte le sue funzioni siano state inizializzate. L'ideale sarebbe creare un plugin, però puo provare nel seguente modo anche se molto rudimentale e probabilmente non il modo miglore:
    
    <?php 
    
    /* Richiedo il file wp-load*/
    require('../../wp-load.php'); // Importnate, devi impostare il path relativo al tuo file wp-load
    
    if ( is_user_logged_in() ){
        $user =  wp_get_current_user();
        print_r($user);
    
    }else{
        echo 'utente non loggato';
    }
    
    ?>
    Prova questo e vedi se ti stampa i dettagli dell'utente.
  • Re: File accessibile solo da codice

    Ottimo, ci sono arrivato ad implementare i tuoi suggerimenti.
    Tuttavia purtroppo il file continua ad essere leggibile da url diretto e illeggibile se recuperato tramite codice php.

    Di seguito la mia configurazione (ulteriormente sviluppata secondo mie esigenze).

    FILE HTACCESS (ma lo stesso risultato lo ottengo con un deny from all suggerito da te):
    
    <IfModule mod_rewrite.c>
    
        RewriteEngine On
    
        #RewriteCond %{REQUEST_FILENAME} ^
        #RewriteCond %{HTTP_HOST} ^
        RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
        
        RewriteRule ^ https://www.miosito.it/paginadilogin/?redirect_to=%{REQUEST_URI}
        
    </IfModule>
    
    FILE index.php presente nella stessa cartella del file (in cui $logged viene dichiarata e valorizzata correttamente in wp-load.php)
    
    <?php
    
    require_once($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');
    
    
    If ($logged == 'TRUE') {
        //echo 'TRUE';
        $file_url = "https://www.miosito.it/test2/info_cliente.cpa";
        header("Content-Type: application/csv");
        header('Content-Disposition: attachment; filename=name of csv file');
        header("Content-disposition: attachment; filename='\"" . basename($file_url) . "\"");
        header('Pragma: no-cache');
        readfile($file_url); 
    
    }
    Else {
        //do nothing;
    }
    
    ?>
    
  • Re: File accessibile solo da codice

    Groviglio ha scritto:


    FILE HTACCESS (ma lo stesso risultato lo ottengo con un deny from all suggerito da te):
    Sembra che il file .htaccess non faccia il suo dovere. Che succede se inserisci questo codice nel file .htaccess e provi a fare download diretto?
    <FilesMatch ".*">
        Order Allow,Deny
        Deny from All
    </FilesMatch>
  • Re: File accessibile solo da codice

    Avevo già provato.
    In ogni caso il risultato è ancora peggio:

    Forbidden
    You don't have permission to access this resource.

    Sarà che con questa configurazione il file index.php non è accssibile a prescindere?
  • Re: File accessibile solo da codice

    Ok, ho un ulteriore sviluppo:
    ho impostato il file .htaccess lasciando libera l'esensione .php:
    
    <FilesMatch "\.(?:inc|py|rb|cpa|csv)$">
    
        Order Allow,Deny
        Deny from All
        
    </FilesMatch>
    
    Ora se carico l'url diretto del file me lo dà inaccessibile, se carico index.php esegue il download di un file nominato come il file da scaricare ma con all'interno una frase di errore:
    
    <br />
    <b>Warning</b>:  readfile(https://www.miosito.it/test2/info_cliente.csv): failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden
     in <b>/web/htdocs/www.miosito.it/home/test2/index.php</b> on line <b>13</b><br />
    
    Per intenderci, la linea 13 è quella del "readfile($file_url);"
  • Re: File accessibile solo da codice

    Il file che php sta cercando di scaricare è cpa non csv prova a modificare l’header

    header("Content-Type: application/csv");

    Con

    header("Content-Type: application/cpa");

    Oppure comprimi il file in un archivio zip

    header("Content-Type: application/zip");

    Non sono sicuro ma potrebbe essere questo il problema
  • Re: File accessibile solo da codice

    Grazie per il gentile supporto.
    Alla fine ci sono riuscito e vorrei condividere la soluzione.
    Tutto ha iniziato a funzionatre quando ho sostituito la prima parte dell'url di residenza dei file con la variabile $_SERVER['DOCUMENT_ROOT'].
    A livello di pagina php i dati quindi vengono recuperati come da seguente esempio (io ad esempio ho creato uno shortcode sul file functions.php):
    
            $percorso = $_SERVER['DOCUMENT_ROOT'].'/caricati/cartellariservata/info_cliente.cpa';
            $filecontent = file_get_contents($percorso); //assumendo che il file sia in formato csv si procede ad importarlo in unica stringa
            echo $filecontent;
    
    A quel punto non ho più avuto bisogno di altri files php di ausilio per forzare il download perché tutto ha funzionato alla perfezione direttamente.
    Ho quindi creato 2 cartelle:
    1) una con i files "più riservati" ai quali si accede solo tramite codice e con accesso negato se raggiunti direttamente con il relativo url: per fare ciò il file .htaccess è stato impostato su "deny from all" come da te suggerito.
    2) un'altra con dei files ad accesso "filtrato" concesso agli utenti autenticati anche attraverso url diretto. Per fare ciò ho impostato il file .htaccess come segue.
    
    <IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in.*$ [NC]
        RewriteRule ^ https://www.url_di_login/?redirect_to=%{REQUEST_URI}
    </IfModule>
    


    Non sono un programmatore e ho iniziato da poco con il php: spero tuttavia nel mio piccolo che questo post servirà a qualcuno.
Devi accedere o registrarti per scrivere nel forum
9 risposte