-
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.
-
Interessante ipotesi ma... hai controllato se è corretta? :mrgreen:
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);
}
-
@dreadnaut felice che funziona :D
Ho corretto con esempio per il protocollo http e codifica percentuale.