2009-08-01 15 views
6

スクリプトを終了した後にスクリプトを削除する方法を教えてください。PHPスクリプト自体を削除する方法(およびdirを含む)

編集:それは私のインストールスクリプトのため

だ、私はそれがセキュリティ上の理由(攻撃者は、既存のサイトを上書きすることはできません)のために自分自身を削除したいです。

私はそのファイルを含むディレクトリを持っています。誰かがこのディレクトリを削除する方法を追加できますか? Includes directoryは、インストールスクリプトがあるフォルダと同じフォルダのサブディレクトリです。

+0

お使いのOSはどちらですか? – Freddy

+6

Unixのようなシステムでは、基本的にremoveはファイルのinodeをディレクトリからリンク解除するだけです。プログラムが実行を停止すると、最後のunlink(プログラム自体)は削除され、inodeにはリンク(削除されます)。オペレーティングシステムのようなウインドウでは、削除するとそれにアクセスする他のプログラムがあるかどうかをチェックし、呼び出し元のプログラムによってトリガーされる外部スレッドを持たない限り削除できないので、削除できません。 – Freddy

答えて

4

Try unlink Webサーバーのユーザーは、ディレクトリ/スクリプトに対する書き込み権限が必要です。 "証拠" として

unlink(__FILE__); 

11

あなたは、現在のファイルのフルパスを取得するには、ファイルを削除するためにunlinkを使用して、__FILE__でき

[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 

=>ファイルが存在しています

=>これにはコードが含まれています

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

=>私はスクリプトが

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

=>それを動作させる。このためにはもう


存在していない、あなたはあなたが必要なprivilegiesを持っていることを確認する必要があります起動...これは、ファイルを削除しようとしているユーザーが、そのファイルを含むディレクトリに適切にアクセスする必要があることを意味します。

コマンドラインを使用しているときは、通常OKです。 Apacheを介してこれを行う場合は、そのディレクトリ/ファイルにApacheの書き込みアクセス権を与える必要があります - Apacheは通常、デフォルトでこの種の特権を持っていません(安全ではなく、通常は不要です)それはしかし、Windows上で可能になると思い


わからない... ...それは、Linux上で動作しますが、それが実行されていたときにWindowsがちょっとファイルを「ロック」かもしれません

+0

偉大な、私はそれをテストします。私はLinux上で、私はWindowsサーバーを避けていると言わなければならないので、Windowsについて心配しないでください:) – Phil

1

unlink($_SERVER['SCRIPT_FILENAME']);
または
unlink(__FILE__);他の回答に

3

サイドノート:

私は私見良いオプションではありません削除、ファイルの名前を変更、またはファイルの先頭にexit文を置くことをお勧めします。ユーザーは、インストールスクリプトを読んだり、再実行したりすることができます。多分これはよりよい解決策が考えられます。

$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 
); 

、あなたにも、Webサーバがクライアントに渡さない何かに名前を変更でき、またはさらに良く、どこかに移動し、Webサーバーは、へのアクセスを持っていませんあるいはその両方:

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

ディレクトリを削除についてインストールスクリプトはしかし、インストールスクリプトにに移動された場所...

を言及するのを忘れないでください:これはrmdir()で行われ、しかし、ディレクトリは空でなければなりません。フォルダの移動はファイルと同じで、機能はrename()です。

関連する問題