2009-08-01 16 views
6

Come faccio a cancellare lo script da solo dopo che avrà finito il suo lavoro?Come fare lo script php cancellare se stesso (e include dir)

edit:

E 'per il mio script di installazione, lo voglio cancellare se stesso per motivi di sicurezza (in modo attaccante non sarà in grado di sovrascrivere sito esistente).

ho dimenticato di dire che Essa ha la sua 'include' directory che vorrei cancellare troppo ... Qualcuno potrebbe aggiungere come eliminare anche questo dir? Include directory è la sottodirectory della stessa cartella in cui si trova lo script di installazione.

+0

Su quale sistema operativo stai lavorando? – Freddy

+6

In Unix Come i sistemi è possibile rimuovere il file da solo, dal momento che la rimozione semplicemente scollega l'inode del file dalla directory, quando il programma smette di funzionare e l'ultimo collegamento (il programma stesso) viene rimosso e l'inode non ha più collegamenti (così è cancellato). In Windows come i sistemi operativi non è possibile farlo, poiché la rimozione controlla se ci sono altri programmi che accedono ad esso (cosa che succederà) e non può essere cancellato a meno che non si disponga di un thread esterno che verrà attivato dal programma chiamante. – Freddy

risposta

4

Prova unlink. L'utente del webserver avrà bisogno di permessi di scrittura per la directory/script.

11

È possibile utilizzare unlink per rimuovere un file, e __FILE__ per ottenere il percorso completo del file corrente:

unlink(__FILE__); 

come una "prova":

[email protected]:~/developpement/tests/temp 
$ ll | grep 'remove-myself.php' 
-rw-r--r-- 1 squale squale  25 2009-08-01 17:01 remove-myself.php 

=> Il file esiste

[email protected]:~/developpement/tests/temp 
$ cat remove-myself.php 
<?php 

unlink(__FILE__); 

=> Esso contiene il codice ho dato

012.
[email protected]:~/developpement/tests/temp 
$ php ./remove-myself.php 

=> lancio lo script

[email protected]:~/developpement/tests/temp 
$ ll | grep 'remove-myself.php' 

=> non esiste più


Per far funzionare tutto questo, dovrete essere sicuri di avere i necessari privilegies ... questo significa che l'utente che tenta di cancellare il file deve avere il diritto di accesso alla directory che lo contiene.

Quando si è in riga di comando, è generalmente OK; ma se si sta tentando di farlo tramite Apache, sarà necessario fornire l'accesso in scrittura Apache a tale directory/file - Apache generalmente non dispone di quel tipo di privilegio per impostazione predefinita (non protetto, e generalmente non necessario)


Non sono sicuro che sarebbe stato possibile su Windows, anche se ... funziona su Linux, ma Windows potrebbe genere di "bloccare" il file quando è in esecuzione ...

+0

Fantastico, lo proverò. Sono su Linux e devo dire che sto evitando i server Windows quindi non preoccuparti di Windows :) – Phil

1

unlink($_SERVER['SCRIPT_FILENAME']);
o
unlink(__FILE__);

3

Nota a margine per altre risposte:

lo consiglio rinominare il file, o di mettere una dichiarazione di uscita all'inizio del file, la rimozione è una buona opzione non IMHO. L'utente potrebbe voler leggere lo script di installazione o rieseguire l'esecuzione.Forse questa potrebbe essere una soluzione migliore:

$contents = file_get_contents(__FILE__); 
file_put_contents(__FILE__, 
    "<?php # Remove this line and the next line to re-configure the application 
    die('The application has already been configured.'); ?>\n" . $contents 
); 

Si potrebbe pure rinominarlo in qualcosa che il web server non passerà ai clienti, o meglio ancora, spostarlo da qualche parte il server web non ha alcun accesso, o addirittura entrambi:

rename(__FILE__, '/tmp/' . basename(__FILE__) . '.bak'); 

non dimenticare di menzionare il posto lo script di installazione è stato spostato nello script di installazione, anche se ...

a proposito di cancellare le rubriche: Questo viene fatto con rmdir(), il la directory deve essere vuota, comunque. Lo spostamento delle cartelle è uguale a quello dei file, la funzione è chiamata rename().

Problemi correlati