完全从服务器上删除一个文件
我想通过使用PHP删除一个文件。 我已经使用unlink()
函数,但我想知道关于unlink
的安全性。 文件是否完全从服务器上删除? 我想确保没有办法获取文件,并将文件从服务器上完全删除。
以二进制模式打开文件进行写入,在整个文件上写入1,closures文件,然后取消链接。 覆盖文件中的任何数据,所以无法恢复。
就个人而言,我会说使用1而不是0作为1是实际数据,并将始终写入,其中0可能不会写入,取决于几个因素。
编辑:经过一番思考和阅读的意见,我会采取混合的方法,取决于“如何删除”你想要的文件,如果你只是想使它的数据无法恢复,覆盖整个文件因为这个速度很快,并且破坏了数据,所以这个问题是在磁盘上留下了一个统一的数据长度,它推断出一个文件被使用在那里,并且给出了文件的长度,给出了重要的法医信息。 简单地写入随机数据也不会避免这种情况,就好像这个文件周围的所有驱动器扇区都没有被触摸一样,这也会留下一个法庭痕迹。
在法医删除,混淆和合理的可否认性方面是最好的解决scheme(同样,这是矫枉过正的,但是为了增加它而添加它),用1来覆盖整个文件长度,然后,对于文件长度以字节为单位,从随机长度大小的mt_rand
中,从随机的起始点开始写入,留下许多不同长度的文件在这个区域的印象,从而产生一个错误的踪迹。 (再次,这是完全矫枉过正的,一般只有连环杀手和中央情报局才需要,但为了这样做,我会加上它)。
美国政府曾经build议对磁盘进行七步擦拭。 1)所有'1's 2)所有'0'3)模式'01'4)模式'10'5)随机模式6)所有'1'7)随机模式,
重新的代码示例,使用像PHP这样的语言是错误的这种types的擦拭,因为你的操作系统上的中继真正擦拭文件,而不是像最后一次只擦拭它,或只是断开它的东西砍刀,但是…
(另)
$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”的文件,但它回答了你的问题:“文件是否完全从服务器上删除?
在某些情况下,不! (在UNIX / POSIX OS上)。
根据php unlink()手册页上的最高评论,unlink函数并没有真正删除文件, 而是删除了文件内容的系统链接 ! 由于文件可以有多个文件名(!)[符号链接?],文件只有在所有文件名解除链接时才会被删除。 所以,如果你的文件有两个名字,那么unlink()不会真的删除这个文件,除非你取消了两个文件名的链接。 亲爱的Linux的家伙,请在这里纠正我的需要。
这可能是为什么函数被称为unlink()而不是删除() !
这里的优秀评论的完整报价:
删除一个大文件,但没有增加可用空间或减less磁盘使用量? 使用UNIX或其他POSIX操作系统? 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) 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
文件`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
保持活动状态(仍然使用磁盘空间)保持文件打开的进程。 只要进程保持打开状态,主体就不会被释放(不会释放磁盘空间)。 事实上,有一种奇怪的方式来复活被错误删除的文件,但仍然被一个进程打开。
看看这里的unlink()
的姐妹functionlink()
。
(imo)通过PHP删除文件的最佳方式:
使用PHP(在Linux中)真正删除文件的方法是使用exec()
函数,该函数执行真正的bash命令(使用linux bash进行正确的btw操作)。 在这种情况下,文件test.jpg
将被删除,方法是:
exec("rm test.jpg);
关于如何正确使用rm
(remove)的更多信息可以在这里find。 请注意:PHP需要删除文件的权利!
更新:不幸的是,Linux rm
命令也没有真正删除文件,如果它有两个名称/链接。 在这里寻找更多的信息。 我将对此进行更深入的研究并提供反馈意见
有可能因为磁盘上的碎片,文件的某些部分将保留,即使文件被完全覆盖。
另一种方式是运行(通过shell_exec()
)外部程序,即系统特定的。 这里是一个例子 (对于Windows),但是我没有testing它。
你应该多次重写覆盖,以消除痕迹。 例如使用美国国防部5220-22.M:“用一个字符覆盖所有可寻址位置,其补码,然后随机字符并validation”(来自killdisk站点)
以下是EFFbuild议永久删除文件http://ssd.eff.org/tech/deletion 。