La generazione di un tempo a base di nome di file univoco per l'upload, senza la creazione di una condizione di competizione

StackOverflow https://stackoverflow.com/questions/1261805

  •  12-09-2019
  •  | 
  •  

Domanda

Sto generazione di un nome di file univoco per i file caricati con il seguente codice

$date = date( 'U' );
$user = $_SERVER[REMOTE_ADDR];
$filename = md5($date.$user);

Il problema è che voglio usare questo nome di file di nuovo più avanti nello script, ma se lo script prende un secondo per l'esecuzione, ho intenzione di trovare un nome diverso per la seconda volta ho provato a usare questa variabile.

Per esempio, sto usando un caricamento/ridimensionamento/salva immagine con nome script di caricamento.Il primo funzionamento dello script è quello di copiare e salvare l'immagine ridimensionata, che io uso una data funzione per assegnare un nome univoco.Quindi lo script processses salva e salva tutta la carica, e gli assegna un nome.Alla fine dello script ($thumb e $full sono le variabili), ho bisogno di inserire in un database MySQL, i nomi dei file che ho usato quando ho salvato l'upload.

Il problema è, a volte su immagini di grandi dimensioni, ci vuole più di un secondo (o durante il processo, il secondo cambia) risultante in un nome di file diverso di essere inseriti nel database che è ciò che il file viene effettivamente salvato sotto.

Questo è solo non è una buona idea di utilizzare questo metodo di denominazione?

È stato utile?

Soluzione

Per quanto ne so è un ottimo modo per il nome del file, anche se vorrei verificare file_exists() e magari virare su un numero casuale.

Avete bisogno di memorizzare il nome del file in una variabile e di riferimento in un secondo momento, invece di utilizzare l'algoritmo di ogni tempo.Questo potrebbe essere inserita nella $_SESSION, un biscotto, una variabile, ecc tra di pagine scaricate.

Speranza che aiuta

Altri suggerimenti

Voglio solo aggiungere che PHP ha una funzione per creare identificatori: uniqid. È anche possibile far precedere l'identificatore con una stringa (data forse?).

convalidare Introdurre sempre per l'utente, e le intestazioni di server!

mi sento di raccomandare memorizzare il nome del file nella sessione (come da AI). Se si memorizza in una delle altre variabili, è più probabile per l'utente finale sia in grado di attaccare il sistema attraverso di essa. MD5 di utenti concatenato con rand () sarebbe un bel modo per ottenere una lunga lista di valori univoci. Proprio utilizzando rand () avrebbe probabilmente una maggiore percentuale di conflitti.

Non sono sicuro circa il processo che si sta seguendo per il caricamento dei file, ma un altro modo per gestire il caricamento di file con PHP è incorporato nei gestori. È possibile caricare il file e quindi utilizzare i metodi "sicuri" per tirare i file caricati dallo spazio temporaneo. (Lo spazio temporaneo in questo caso può essere situato in modo sicuro al di fuori della direttiva di base dir aperta per evitare la manomissione). is_uploaded_file () e move_uploaded_file () da: http: // php .net / manuale / it / features.file-upload.post-method.php esempio 2 potrebbe gestire il problema si è verificato.

Sicuramente verificare la presenza di un file esistente in quella posizione se si sceglie un nome di file al volo. Se l'input dell'utente è consentito in alcun modo o forma, convalidare e filtrare l'argomento per assicurarsi che sia sicuro. Inoltre, se la cartella di archiviazione è web accessibile, assicurarsi che si munge il nome e probabilmente l'estensione pure. Tu non vuoi che qualcuno sia in grado di caricare il codice e quindi in grado di eseguirlo. Che porta ufficialmente alle attività male.

Ho appena scoperto che PHP ha una funzione built-in per questo, chiamato tempnam. E 'anche evitare condizioni di gara. Vedere http://php.net/manual/en/function.tempnam.php.

Perché non usare

$filename = md5(rand());

Questa sarà praticamente unico in ogni caso. E se si scopre che $filename già esistente si può chiamare di nuovo.

Non è una buona idea utilizzare ID dipendente dal tempo - se si carica due immagini allo stesso tempo, l'uno più tardi può sovrascrivere la precedente. Si dovrebbe guardare a funzione come uniqid () . Tuttavia, se questo upload / ridimensionare / Salva script è destinato a essere "-single user", allora questo non è un grosso problema.

Per il problema stesso. Se fossi in te, vorrei solo salvare il nome del file calcolata ad una variabile l'uso della variabile da quel punto. Computing già calcolato è spreco di tempo. E durante il caricamento di alcune immagini davvero grande, o più immagini in una sola volta, script può prendere anche 20 secondi. Non si può dipendere da fatto che tu farai tutto quello che vuoi in un secondo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top