47

PHPでファイルを削除したい。機能を使ったことはありunlink()ますが、セキュリティが不安でしunlinkた。ファイルはサーバーから完全に削除されていますか? ファイルを元に戻す方法がなく、ファイルがサーバーから完全に削除されていることを確認したい.

4

7 に答える 7

11

米国政府は、ディスクに対して 7 ステップのワイプを推奨していました。1) すべて「1」 2) すべて「0」 3) パターン「01」 4) パターン「10」 5) ランダムパターン 6) すべて「1」 7) ランダムパターン

コードサンプルを再確認すると、このタイプのワイプではPHPのような言語を使用することは間違っています.OSでのリレーは実際にファイルをワイプし、最後にワイプしたりリンクを解除したりするなどのクリーバーを行わないためです...

(未テスト)

$filename = "/usr/local/something.txt";
$size = filesize($filename);

$pat1 = chr(0);
$pat2 = chr(255);
$pat3 = chr(170);
$pat4 = chr(85);

$mask = str_repeat($pat1, $size);
file_put_contents($filename, $mask);

$mask = str_repeat($pat2, $size);
file_put_contents($filename, $mask);

$mask = str_repeat($pat3, $size);
file_put_contents($filename, $mask);

$mask = str_repeat($pat4, $size);
file_put_contents($filename, $mask);
于 2013-07-19T14:52:12.793 に答える
4

これは、「PHP を使用して」ファイルを完全に削除する方法には答えないかもしれませんが、「ファイルはサーバーから完全に削除されていますか?」という質問には答えます。

場合によっては、いいえ!(UNIX/POSIX OS 上)。

公式のPHP unlink() マニュアル ページで最も投票されたコメントによると、unlink 関数は実際にはファイルを削除するのではなく、ファイルのコンテンツへのシステム リンクを削除しています。ファイルには複数のファイル名 (!) [symlinks?] を付けることができるため、ファイルはすべてのファイル名のリンクが解除された場合にのみ削除されます。したがって、ファイルに 2 つの名前がある場合、両方のファイル名を unlink() しない限り、unlink() は実際にはファイルを削除しません。親愛なる Linux の皆さん、必要に応じてここで訂正してください。

これが、関数がdelete()ではなくunLINK()と呼ばれる理由かもしれません!!!

ここに素晴らしいコメントの完全な引用があります:

大きなファイルを削除しましたが、空き容量の増加やディスク使用量の減少が見られませんか? UNIX またはその他の POSIX OS を使用していますか? unlink() はファイルを削除することではなく、ファイル名を削除することです。マンページには次のように書かれています: `unlink - delete a name and possibly the file it refers to''. Most of the time a file has just one name -- removing it will also remove (free, deallocate) thebody' of file (注意点が 1 つあります。以下を参照してください)。それは単純な、通常のケースです。ただし、ファイルが同じディレクトリまたは異なるディレクトリに複数の名前 (link() 関数を参照) を持っていてもまったく問題ありません。すべての名前はファイル本体を参照し、ファイルをkeep it alive', so to say. Only when all the names are removed, the body of file actually is freed. The caveat: A file's body may *also* be開いたままにしているプロセスによって (まだディスク領域を使用して) 保持されます。プロセスがボディを開いたままにしている限り、ボディの割り当ては解除されません (ディスク領域は解放されません)。実際、誤って削除されたファイルを復活させる素晴らしい方法がありますが、プロセスによって開かれたままになっています...

ここでunlink()姉妹機能を見てください。link()

PHP経由でファイルを削除する(imo)最良の方法:

PHP (Linux の場合) でファイルを実際に削除する方法は、exec()実際の bash コマンドを実行する関数を使用することです (Linux の bash で行うことは正しいと感じます)。この場合、ファイルtest.jpgは次のようにして削除されます。

exec("rm test.jpg);

正しく使用 (削除) する方法の詳細についてはrm、たとえばこちらを参照してください。注意: PHP にはファイルを削除する権限が必要です。

更新:残念ながら、Linuxrmコマンド ALSO は、ファイルに 2 つの名前/リンクがある場合、実際にはファイルを削除しません。詳細については、こちらをご覧ください。それについては、さらに調査を行い、フィードバックを提供します...

于 2013-07-18T19:51:36.547 に答える
2

ファイルが完全に上書きされたとしても、ディスク上の断片化のためにファイルの一部が残る可能性があります。

shell_exec()もう 1 つの方法は、システム固有の外部プログラムを (によって) 実行することです。以下は例(Windows 用) ですが、テストしていません。

于 2013-07-09T13:12:38.577 に答える
0

痕跡を消すには、上書きを複数回行う必要があります。たとえば、US DoD 5220-22.M を使用すると、「すべてのアドレス可能な場所を文字、その補数、ランダムな文字で上書きして検証する」(killdisk サイトから)

于 2013-07-16T08:42:43.787 に答える