Pagina 2 di 2 PrimoPrimo 12
Visualizzazione risultati 31 fino 33 di 33

Discussione: Lo stesso script di upload crea files con owner e permessi diversi

  1. #31
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    In una URI il carattere spazio è riservato, in un percorso diverso da query string è %20 mentre in query string è +.
    In realtà non ho guardato il sorgente C, C++ che crea move_uploaded_file disponibile all'utente sottoforma di funzione php nativa.

    Quindi il mio esempio sostituisce lo spazio in %20 della funzione move_uploaded_file $to.

    Codice HTML:
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    <!-- The data encoding type, enctype, MUST be specified as below -->
    <form enctype="multipart/form-data" action="https://darbula.altervista.org/tm3p/form.php" method="POST">
    <!-- MAX_FILE_SIZE must precede the file input field -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- Name of input element determines name in $_FILES array -->
    Send this file: <input name="userfile" type="file" />
    <input type="submit" value="Send File" />
    </form>
    </body>
    </html>
    Codice PHP:
    <?php
    $uploaddir
    = '/membri/darbula/tm3p/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);

    echo
    '<pre>';
    if (
    move_uploaded_file($_FILES['userfile']['tmp_name'], str_replace(' ', '%20', $uploadfile))) {
    echo
    "File is valid, and was successfully uploaded.\n";
    } else {
    echo
    "Possible file upload attack!\n";
    }

    echo
    'Here is some more debugging info:';
    print_r($_FILES);

    print
    "</pre>";

    ?>
    Se il file originale si chiama file .txt la sua url con codifica percentuale se lo spazio è sostituito in %20 https://www.domain.tld/tm3p/file%2520.txt, altrimenti aggiungi rename con destinazione originale per preservare il carattere di spazio bianco

    Però penso che il chmod di altervista non consenta l'applicazione dei permessi al più non ritorna false. Però la documentazione afferma che in alcune circostanze php ricorda l'impostazione dei permessi anche se non li cambia
    Questo è un text il file creato con %20 non è valido, occorre rinominare con altro.
    Ultima modifica di darbula : 23-01-2023 alle ore 02.01.31

  2. #32
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,252

    Predefinito

    Interessante ipotesi ma... hai controllato se è corretta?

    Il file "temporaneo" ha un nome casuale che non contiene mai spazi, tipo /membri/.dummy/temp/php0rpjk6. Il problema non è collegato all'URL encoding: dopo tutto, URL e nomi di file sono insiemi separati, che seguono regole diverse. La direzione è giusta però!

    Togliendo caratteri spazio dal nome destinazione, move_uploaded_file() mantiene proprietario e permessi corretti. È possibile quindi spostare un file "senza spazi", e poi dargli il nome originale. Se il file viene usato solo via PHP, o scaricato via FTP, non è un problema se il nome contiene spazi.

    Tornando al codice di giornalinothewest:
    Codice PHP:
    $target_dir = "/membri/giornalinothewest/edAtt/{$usr}/";

    $original_name = $_FILES['fileToUpload']['name'];
    $safe_name = "UPLOAD-" . md5($original_name) . "-" . str_replace(' ', '-', $original_name);

    # [...]

    move_uploaded_file($_FILES['fileToUpload']['tmp_name'], $target_dir . $safe_name);
    rename($target_dir . $safe_name, $target_dir . $original_name);
    Il risultato dovrebbe essere un file con i permessi giusti, ed il nome originale.

    [edit] Visto che questa può servire ad altri, la metto qua:
    Codice PHP:
    function av_move_uploaded_file(string $from, string $to) : bool
    {
    if (
    strpos($to, ' ') === false) {
    return
    move_uploaded_file($from, $to);
    }

    $path = dirname($to);
    $filename = basename($to);
    $unique = md5($filename);
    $toWithoutSpaces = str_replace(' ', '-', $filename);

    $safeTo = "{$path}/upload-{$unique}-{$toWithoutSpaces}";

    return
    move_uploaded_file($from, $safeTo) && rename($safeTo, $to);
    }
    Ultima modifica di dreadnaut : 22-01-2023 alle ore 20.57.35

  3. #33
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    @dreadnaut felice che funziona :D
    Ho corretto con esempio per il protocollo http e codifica percentuale.

Pagina 2 di 2 PrimoPrimo 12

Regole di scrittura

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