On Thu, 18 May 2006 21:50:09 +0200
Maurizio Lemmo - Tannoiser <tannoiser@xxxxxxxxxxx> wrote:
> * giovedì 18 maggio 2006, alle 21:10, Ivan Sergio Borgonovo scrive:
> > banalmente in php:
> >
> > $workdir = "/tmp/".basename($argv[0])."/";
> > mkdir( $workdir, 700 );
> > mkdir( $workdir."results", 700 );
> >
> > La prima dir la crea... il problema è che non la crea 700 (sticky
> > bit etc...).
Auto clue mancato!
> > Immagino ci sia una buona ragione "sistemistica" la spiegazione
> > della quale mi risulterebbe interessante e gradita ma che al
> > momento è accessoria.
> >
> > Se però un proggy deve creare una struttura di directory
> > temporanea... allora dove è "cosa buona e giusta che la faccia"?
>
> In generale, questa roba e` bruttaccina, ed espone a un "noto bug di
> security".
Quale? Che altri ci possono guardare dentro?
Che uno sa che scrivi il file X e la dir Y, le scrive lui *prima* e tu finisci
per dargli accesso? per questo basta controllare l'uscita di mkdir credo.
Decisamente dal punto di vista sistemistico non capisco q.che cosa.
Ora se il problema fosse "non ci deve guardare nessuno", /tmp sarebbe sempre
vuota, ma non è così.
Anzi, non solo è così ma le ownership e i permessi ci sono e funzionano.
A parte il mio errore da pistola che involontariamente mi hai fatto notare
700!=0700 e che risolve la questione trovo il tuo codice non permetta "cleanup"
sicuro.
Ovvero, visto che tempdir(...) non garantisce che il tutto vada in un posto che
verrà automaticamente pulito se il programma chioda la roba rimane in $dir con
l'aggravante che effettivamente una volta morto il programma non ne sai più il
path effettivo... che vuol dire che a) se c'erano dati "salvabili" te li sei lo
stesso fottuti b) se non c'erano stai buttando via disco perchè l'unico
programma che potrebbe "pulire" è lo stesso che non li userebbe.
Il while (!mkdir(...)) mi sembra in cerca di guai.
Il problema non è banalissimo nel senso che per i file c'è tempnam e tmpfile.
Ma da php non c'è niente di equivalente a mkdtemp.
Per andare sul sicuro: hash dell'ora/giorno, del pid + rnd e segno zodiacale.
A meno che sto coso gira in multithread su bluegene.
> La soluzione IMHO appropriata, e`:
>
> <?php
> function tempdir($dir, $prefix='', $mode=0700) {
> if (substr($dir, -1) != '/') $dir .= '/';
>
> do {
> $path = $dir.$prefix.mt_rand(0, 9999999);
> } while (!mkdir($path, $mode));
>
> return $path;
> }
> ?>
> Oppure usa una system (che mi piace sempre poco).
che a parte i tempi di fork che svantaggi avrebbe?
ronf... zzz... salvo e chiudo.
|