Полностью удалять файл с сервера

Я хочу удалить файл с помощью PHP. Я использовал функцию unlink(), но мне было интересно узнать о безопасности unlink. Файл полностью удален с сервера? Я хочу убедиться, что нет способа вернуть файл и файл полностью удален с сервера.

Ответ 1

откройте файл в двоичном режиме для записи, напишите 1 по всему файлу, закройте файл, а затем отсоедините его. перезаписывает любые данные в файле, поэтому его невозможно восстановить.

Лично я бы сказал, что используйте 1 вместо 0, поскольку 1 являются фактическими данными и всегда будут писать, где 0 не может писать, в зависимости от нескольких факторов.

Изменить: После некоторого раздумья и чтения комментариев, я бы пошел с гибридным подходом, в зависимости от того, "как удалено" вы хотите, чтобы файл был, если вы просто хотите это сделать данные не могут быть восстановлены, переписать всю длину файла на 1, так как это быстро, и уничтожает данные, проблема с этим, оставляет ли заданную длину равномерных данных на диске, который указывает на файл, ИСПОЛЬЗУЕМЫЙ, чтобы быть там, и дает прочь длину файлов, предоставляя важные фрагменты судебной информации. Простое создание случайных данных также не позволит избежать этого, так как все сектора диска вокруг этого файла не затронуты, это также оставит криминалистическую трассу.

Лучшее решение факторинга при судебной делеции, обфускации и правдоподобной отрицательности (опять же, это избыток, но я добавляю его для его добавления), перепишите всю длину файла на 1, а затем, для HALF, длину файла в байтах, пишите из mt_rand в случайных размерах длины из случайных исходных точек, оставляя впечатление, что в этой области обычно использовалось много файлов различной длины, создавая тем самым ложный след. (опять же, это полностью избыточно и, как правило, требуется только серийным убийцам и ЦРУ, но я их добавляю для этого).

Ответ 2

правительство США обычно рекомендовало вытирать семь шагов для дисков. 1) все '1' 2) все '0' 3) шаблон '01' 4) шаблон "10" 5) случайный шаблон 6) все '1' 7) случайный шаблон,

Повторить образец кода, используя язык, подобный PHP, неправильно для этого типа очистки, поскольку ваша ретрансляция на ОС действительно стирает файл, а не делает что-то сковороду, как только очищает его в последний раз или просто отключает его..

(непроверенные)

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

Ответ 3

Это может не ответить КАК полностью удалить файл "с PHP", но он отвечает на ваш вопрос: "Является ли файл полностью удален с сервера?"

В некоторых случаях No! (в ОС UNIX/POSIX).

Согласно самому высокому проголосовавшему комментарию на официальной странице PHP unlink(), функция отключения отключена не удаляет файл, удаляет системную ссылку на содержимое файла! Поскольку файлы могут иметь несколько имен файлов (!) [Symlinks?], Файл будет удален только при отсоединении ВСЕХ имен файлов. Итак, если ваш файл имеет 2 имени, то unlink() не будет действительно удалять файл, если вы не отмените() оба имени файла. Уважаемые ребята из Linux, пожалуйста, поправьте меня здесь, если это необходимо.

Возможно, поэтому функция называется unLINK(), а не delete()!!!

Вот полная цитата из превосходного комментария:

Удален большой файл, но не наблюдается увеличения свободного места или уменьшения использования диска? Использование UNIX или другой ОС POSIX? Функция unlink() не касается удаления файла, а об удалении имени файла. В manpage говорится: `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) the body 'файла (с одним оговоркой, см. Ниже). Это простой, обычный случай. Тем не менее, это прекрасно для файла, чтобы иметь несколько имен (см. Функцию 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 body may *also* be сохранено в памяти (все еще используется дисковое пространство) процессом, открытым файлом. Тело не будет освобождено (не освободит место на диске), пока процесс не откроет его. Фактически, есть причудливый способ воскресить файл, удаленный ошибкой, но все еще удерживаемый процессом...

Посмотрите на сестринскую функцию unlink() link() здесь.

(imo) лучший способ удалить файл через PHP:

Способ действительно удалять файл с PHP (в linux) заключается в использовании функции exec(), которая выполняет реальные команды bash (что-то делает с linux bash, чувствую себя корректно btw). В этом случае файл test.jpg будет удален, выполнив:

exec("rm test.jpg);

Подробнее о том, как использовать rm (удалить) правильно, можно найти, например, здесь. Обратите внимание: PHP нуждается в праве удалить файл!

UPDATE: К сожалению, команда linux rm ТАКЖЕ действительно не удаляет файл, если у него есть два имени/ссылки. Посмотрите здесь для получения дополнительной информации. У меня будут более глубокие исследования по этому поводу и дайте отзывы...

Ответ 4

Возможно, что из-за некоторой фрагментации на диске некоторые части файла останутся, даже если файл полностью перезаписан.

Другой способ - запустить (через shell_exec()) внешнюю программу, которая зависит от системы. Вот пример (для Windows), однако я его не тестировал.

Ответ 6

Вам нужно сделать несколько проходов перезаписи для деминирования трасс. Например, используя US DoD 5220-22.M: "Запишите все адресуемые местоположения с символом, его дополнением, затем случайным символом и проверьте" (с сайта killdisk)