Я хочу удалить файл с помощью PHP. Я использовал функцию unlink()
, но мне было интересно узнать о безопасности unlink
. Файл полностью удален с сервера? Я хочу убедиться, что нет способа вернуть файл, и файл полностью удален с сервера.
откройте файл в двоичном режиме для записи, напишите 1 по всему файлу, закройте файл, а затем отсоедините его. перезаписывает любые данные в файле, поэтому их невозможно восстановить.
Лично я бы сказал использовать 1 вместо 0, так как 1 являются фактическими данными и всегда будут писать, где 0 могут не писать, в зависимости от нескольких факторов.
Редактирование: после некоторого раздумья и чтения комментариев, я бы пошел с гибридным подходом, в зависимости от того, «как удалено» вы хотите, чтобы файл был, если вы просто хотите сделать так, чтобы данные не могли быть восстановлены, перезапишите все файлы длина с 1, так как это быстро, и уничтожает данные, проблема с этим заключается в том, что она оставляет заданную длину однородных данных на диске, которая указывает на файл, который ИСПОЛЬЗУЕТСЯ там, и отдает длину файлов, предоставляя важные куски судебной экспертизы Информация. Простое использование случайных данных также не позволит избежать этого, так как все сектора диска вокруг этого файла не затронуты, это также оставит криминалистическую трассировку.
Лучшее решение, факторизующее в судебной делеции, обфускации и правдоподобной отрицательности (опять же, это избыток, но я добавляю его для его добавления), перепишите всю длину файла с 1, а затем, для HALF, длину файла в байтах, пишите из mt_rand
в случайных размерах длины из случайных исходных точек, оставляя впечатление, что в этой области раньше находилось множество файлов различной длины, создавая тем самым ложный след. (опять же, это полностью избыточно и, как правило, требуется только серийным убийцам и ЦРУ, но я их добавляю для этого).
правительство США обычно рекомендовало вытирать семь шагов для дисков. 1) все '1's 2) все' 0's 3) шаблон '01' 4) шаблон '10' 5) случайный шаблон 6) все '1' 7) случайный шаблон,
re пример кода, используя язык, подобный 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);
Это может не ответить КАК полностью удалить файл «с PHP», но он отвечает на ваш вопрос: «Является ли файл полностью удален с сервера?»
Согласно самому высокому проголосовавшему комментарию на официальной странице PHP unlink () , функция unlink не действительно удаляет файл, он удаляет системную ссылку на содержимое файла ! Поскольку файлы могут иметь несколько имен файлов (!) [Symlinks?], Файл будет удален только при отсоединении ВСЕХ имен файлов. Итак, если ваш файл имеет 2 имени, то unlink () не будет действительно удалять файл, если вы не отмените () оба имени файла. Дорогие ребята из Linux, пожалуйста, поправьте меня здесь, если это необходимо.
Вот полная цитата из замечательного комментария:
Удалили большой файл, но не видели увеличения свободного места или уменьшения использования диска? Использование 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
`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
тело 'файла (с одним оговором, см. Ниже). Это простой, обычный случай. Тем не менее, это прекрасно, если файл имеет несколько имен (см. Функцию 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
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
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
сохранено в живых (по-прежнему использующее дисковое пространство) процессом, открывающим файл. Тело не будет освобождено (не освободит место на диске), пока процесс не откроет его. На самом деле, есть причудливый способ воскресить файл, удаленный ошибкой, но все еще удерживаемый процессом …
Посмотрите на link()
функции link()
здесь .
Путь к действительному удалению файла с PHP (в Linux) заключается в использовании функции exec()
, которая выполняет реальные команды bash (делать что-то с linux bash, чувствуя себя корректно кстати). В этом случае файл test.jpg
будет удален:
exec("rm test.jpg);
Более подробную информацию о том, как правильно использовать rm
(remove), можно найти здесь . Обратите внимание: PHP нуждается в праве удалить файл!
UPDATE: К сожалению, команда linux rm
ТАКЖЕ действительно не удаляет файл, если у него есть два имени / ссылки. Посмотрите здесь, чтобы узнать больше. У меня будет более глубокое исследование и дайте отзывы …
Возможно, из-за некоторой фрагментации на диске некоторые части файла останутся, даже если файл полностью перезаписан.
Другой способ – запустить (через shell_exec()
) внешнюю программу, которая является специфичной для системы. Вот пример (для Windows), однако я его не тестировал.
Вы должны сделать несколько проходов перезаписи для деминирования трасс. Например, с использованием US DoD 5220-22.M: «Перезаписать все адресные адреса с символом, его дополнением, затем случайным символом и проверить» (с сайта killdisk)
Вот что EFF рекомендует постоянно удалять файл http://ssd.eff.org/tech/deletion .