Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 27
  1. #11
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Nel senso, se tu passi in nume del file via post:
    Codice PHP:
    <input type="hidden" name="file" value="documento.pdf"
    Poi presumo che lato php fai
    Codice PHP:
     ...
     echo 
    readfile($_POST['file']); 
    Se tu non fai nessun controllo, chi ti dice che qualcuno non cambi il value mettendo ad esempio "download_file.php" ?
    In questo modo si scaricherebbe il tuo file php, che potrebbe far riferimento ad altri file php che potrebbe scaricarsi allo stesso modo.

    Questo vale anche se "forzi" una determinata cartella come "root" per i file:
    Codice PHP:
    $file 'cartella_files/'.$_POST['file'];
    echo 
    readfile($file); 
    Perchè posso usare i .. per cambiare directory:
    Codice PHP:
    <input type="hidden" name="file" value="../download_file.php"

  2. #12
    Si io scrivo nel file "pagina_protetta.php":
    Codice PHP:
    <input type="hidden" name="file" value="documento.pdf"
    e nel file "download_file.php":
    Codice PHP:
    if (isset($_POST ["file"]) and file_exists($_POST ["file"])) {
    $file=$_POST ["file"];
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' filesize($file));
    readfile($file);
    exit;

    Però non capisco come sia possibile cambiare "documento.pdf" con "download_file.php". Inoltre nella mia applicazione non uso MySQL così il fatto che qualcuno possa rubarmi i file php mi importa poco. Quello che voglio difendere è "documento.pdf".
    Inoltre se qualcuno riuscisse a leggere il link in cui è salvato documento.pdf con readfile() da un altro sito non riuscirebbe a scaricare nulla perché readfile() legge solo i file presenti sul server da cui readfile() viene lanciato.
    Il discorso dei puntini è relativo. Posso anche rendere pubblica la mia applicazione tanto poi per scaricare il file serve per forza readfile() lanciato dal mio server. Non capisco cosa intendi per "controllo".
    Più pratica in futuro...

  3. #13
    Sto aggiungendo un tasto ‘cancella file dal server’ ma ho un problema con le sessioni.
    Ho 3 file:
    accesso_area.php
    pagina_protetta.php
    cancella_file.php

    Da accesso_area.php passo a pagina_protetta.php usando un <form>. La password in accesso_area.php viene passata a pagina_protetta.php con $_POST[‘password’]. In pagina_protetta.php chiamo cancella_file.php con un altro <form> premendo su un pulsante. In cancella_file.php c'è la funzione unlink(). Uso unlink() per cancellare un file dal server. Con l’uso degli header passo a pagina_protetta.php ma nel frattempo la password salvata in $_POST[‘password’] è andata persa. Credo che dovrei usare le sessioni, giusto? Però se in pagina_protetta.php scrivo:
    Codice PHP:
    if (isset($_POST ["password"]) and md5 $_POST ["password"] ) === $md5dellapassworddiaccesso){
        
    $_SESSION["password"]=$_POST ["password"];

    e in accesso_area.php scrivo:
    Codice PHP:
    <?php session_start();
    Quando da cancella_file.php torno in pagina_protetta.php leggo:
    Notice: Undefined variable: _SESSION in …\pagina_protetta.php on line 88
    Dove sbaglio?
    Più pratica in futuro...

  4. #14
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Ogni volta che usi $_SESSION devi mettere (meglio all'inizio del file) la session_start()

    Tornando al nome dei file, se l'area riservata è solo per l'amministratore allora puoi anche evitare tutto il discorso che ti avevo fatto (mica l'amministratore si vuole hackerare da solo).
    Se invece è disponibile anche ad altre tipologie di utenti (es registrati) allora si: io, utente registrato, vado nella pagina_protetta(che sono abilitato a consultare) dove c'è il form con in hidden il nome del file, cambio il nome (da browser basta che fai analizza elemento ed editi il nome). Se non fai controlli il tuo script fa scaricare il file e se è uno di configurazione potrebbe ottenere le credenziali per il database o altro

  5. #15
    Ho risolto il problema delle sessioni ma ho ancora alcune domande:
    1.Devo mettere session_start() prima o dopo il codice di sicurezza:

    Soluzione A:
    Codice PHP:
    <?php session_start();
      if (
    get_magic_quotes_gpc()) {
          
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
          while (list(
    $key$val) = each($process)) {
              foreach (
    $val as $k => $v) {
                  unset(
    $process[$key][$k]);
                  if (
    is_array($v)) {
                      
    $process[$key][stripslashes($k)] = $v;
                      
    $process[] = &$process[$key][stripslashes($k)];
                  } else {
                      
    $process[$key][stripslashes($k)] = stripslashes($v);
                  }
              }
          }
          unset(
    $process);
      }
      
    ?>
    Soluzione B:
    Codice PHP:
    <?php
      
    if (get_magic_quotes_gpc()) {
          
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
          while (list(
    $key$val) = each($process)) {
              foreach (
    $val as $k => $v) {
                  unset(
    $process[$key][$k]);
                  if (
    is_array($v)) {
                      
    $process[$key][stripslashes($k)] = $v;
                      
    $process[] = &$process[$key][stripslashes($k)];
                  } else {
                      
    $process[$key][stripslashes($k)] = stripslashes($v);
                  }
              }
          }
          unset(
    $process);
      }
      
    session_start();
      
    ?>
    2.In un vecchio codice che avevo scritto trovo:

    Codice PHP:
    session_cache_limiter ('public');
      
    session_start (); 
    in questo esatto ordine. Qual è l'utilità di questo codice? A me interessa che quando chiuda il browser il file creato dal server si chiuda liberando spazio dal server. Usando hosting gratuiti ho poche risorse a disposizione.
    3.Quando si usa exit in PHP?

    Lo script che cancella file dal server meglio scriverlo così:
    Codice PHP:
    <?php
      
    if (isset($_POST ["file"]) and file_exists($_POST ["file"])) {
      
    $file=$_POST ["file"];
      
    header('Location: pagina_protetta.php');
      
    unlink($file);
      exit;
      }
      
    ?>
    oppure così?
    Codice PHP:
    <?php
      
    if (isset($_POST ["file"]) and file_exists($_POST ["file"])) {
      
    $file=$_POST ["file"];
      
    header('Location: pagina_protetta.php');
      
    unlink($file);
      }
      
    ?>
    entrambi funzionano.
    Per quanto riguarda il discorso sicurezza invece sono molto preoccupato.

    4.Mi spieghi come si fa a cambiare quel pezzo di html con il browser e scaricare il file e soprattutto quali precauzioni posso prendere?

    Buona Pasqua
    Più pratica in futuro...

  6. #16
    P.S.: Alla domanda numero 1 aggiungo:
    Qual è l'ordine esatto tra:
    a.session_start();
    Codice PHP:
    session_start(); 
    b.codice di sicurezza:
    Codice PHP:
    <?php
    if (get_magic_quotes_gpc()) {
        
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
        while (list(
    $key$val) = each($process)) {
            foreach (
    $val as $k => $v) {
                unset(
    $process[$key][$k]);
                if (
    is_array($v)) {
                    
    $process[$key][stripslashes($k)] = $v;
                    
    $process[] = &$process[$key][stripslashes($k)];
                } else {
                    
    $process[$key][stripslashes($k)] = stripslashes($v);
                }
            }
        }
        unset(
    $process);
    }
    ?>
    c.codice per obbligare il browser ad aggiornare:
    Codice PHP:
    <?php
    header 
    "Expires: Mon, 26 Jul 1997 05:00:00 GMT" );
    header "Cache-Control: no-cache" );
    header "Pragma: no-cache" );
    ?>
    Più pratica in futuro...

  7. #17
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    session_start() puoi chiamarla quando vuoi, ma prima di qualunque output. session_cache_limiter dovrebbe mandare come headers alcuni controlli relativi alla cache sessione, fai riferimento al manuale per vedere cosa invia...mai capitato di usarla

    Nel punto 2, non ho capito che intendi sul liberare spazio sul server: i dati del file(che resta sul filesystem) letto stanno in memoria, quando lo script finisce la memoria viene liberata.
    exit() fa terminare lo script...ovviamente è inutile metterlo alla fine.
    Per l'obbligo di aggiornamento...sinceramente è una cosa che ancora non capisco Ho provato qualsiasi headers, ma alcuni browser continuavano ad usare la cache. Tuttavia tu usi come metodo POST, di conseguenza non dovrebbe essere un problema: se non ricordo male POST non dovrebbe causare l'uso della cache da parte del browser.

    Per l'esempio (chrome): nella pagina dove hai il form di download, fai tasto destro->ispeziona sul form (es sul button, visto che l'input è hidden). Nella console, dove c'è il codice della pagina, cerca il tuo input con il nome del file, clicca due volte sul value (oppure tasto destro->edit as html) e sostituisce il nome del file con quello dello script php (se è il caso gioca un po con il path).
    Scarica il file e dovresti avere il tuo script php e non il file originario
    Ultima modifica di boots; 03-04-2018 a 09:12

  8. #18
    Quote Originariamente inviata da boots Visualizza il messaggio
    session_start() puoi chiamarla quando vuoi, ma prima di qualunque output. session_cache_limiter dovrebbe mandare come headers alcuni controlli relativi alla cache sessione, fai riferimento al manuale per vedere cosa invia...mai capitato di usarla

    Nel punto 2, non ho capito che intendi sul liberare spazio sul server: i dati del file(che resta sul filesystem) letto stanno in memoria, quando lo script finisce la memoria viene liberata.
    exit() fa terminare lo script...ovviamente è inutile metterlo alla fine.
    Per l'obbligo di aggiornamento...sinceramente è una cosa che ancora non capisco Ho provato qualsiasi headers, ma alcuni browser continuavano ad usare la cache. Tuttavia tu usi come metodo POST, di conseguenza non dovrebbe essere un problema: se non ricordo male POST non dovrebbe causare l'uso della cache da parte del browser.

    Per l'esempio (chrome): nella pagina dove hai il form di download, fai tasto destro->ispeziona sul form (es sul button, visto che l'input è hidden). Nella console, dove c'è il codice della pagina, cerca il tuo input con il nome del file, clicca due volte sul value (oppure tasto destro->edit as html) e sostituisce il nome del file con quello dello script php (se è il caso gioca un po con il path).
    Scarica il file e dovresti avere il tuo script php e non il file originario
    Quindi secondo te l'ordine corretto è header, codice di sicurezza e session_start()?
    Ho fatto quello che mi dici e mi cade il mondo addosso! Dunque come posso limitare questa cosa?
    ciao
    Più pratica in futuro...

  9. #19
    A tuo avviso è sufficiente usare una funzione di questo tipo, sia per quanto riguarda il download che l’upload ed il cancellamento?
    Codice PHP:
    function URL_inizio($URL,$inizio){
                    if(
    mb_substr($URL,0,strlen($inizio))==$inizio){
                                   return 
    true;
                    } else {
                                   return 
    false;
                    }

    In pratica uso readfile(), unlink() e move_uploaded_file() quando URL_inizio() mi restituisce true? Come filosofia può funzionare? $inizio, se te lo stai chiedendo, è l’inizio del URL ovvero il nome della cartella in cui si trovano i file da scaricare, aggiungere e cancellare. $URL è invece la URL presente nel form e che può essere modificata dal browser.
    Ultima modifica di giannino1995; 03-04-2018 a 16:10
    Più pratica in futuro...

  10. #20
    Utente di HTML.it L'avatar di boots
    Registrato dal
    Oct 2012
    Messaggi
    1,626
    Il problema è che puoi usare anche i ".."
    Se decidi che $inizio = "cartella_privata" allora uno smaliziato potrebbe scrivere:
    "cartella_privata/../file.php"
    La tua funzione non andrebbe bene

    Io farei anche uno str_replace di "../" con ''
    Ultima modifica di boots; 03-04-2018 a 17:05

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 © 2024 vBulletin Solutions, Inc. All rights reserved.