如何让php脚本自行删除(并包含dir)

时间:2009-08-01 14:55:00

标签: php security

如何在完成工作后自行删除脚本?

编辑:

这是我的安装脚本,我希望它出于安全原因删除自己(因此攻击者将无法覆盖现有网站)。

我忘了提及它有'包含'目录我想删除... 有人可以添加如何删除这个目录吗?包含directory是安装脚本所在的同一文件夹的子目录。

4 个答案:

答案 0 :(得分:12)

您可以使用unlink删除文件,使用__FILE__获取当前文件的完整路径:

unlink(__FILE__);

作为“证据”:

squale@shark:~/developpement/tests/temp
$ ll | grep 'remove-myself.php'
-rw-r--r-- 1 squale   squale      25 2009-08-01 17:01 remove-myself.php

=>该文件存在

squale@shark:~/developpement/tests/temp
$ cat remove-myself.php
<?php

unlink(__FILE__);

=&GT;它包含我给出的代码

squale@shark:~/developpement/tests/temp
$ php ./remove-myself.php

=&GT;我启动了脚本

squale@shark:~/developpement/tests/temp
$ ll | grep 'remove-myself.php'

=&GT;它不再存在


为此,您必须确保您具有所需的特权...这意味着尝试删除文件的用户需要在包含该文件的目录上具有正确访问权限。

当你在命令行时,它通常是正常的;但如果您尝试通过Apache执行此操作,则需要对该目录/文件进行Apache写访问 - 默认情况下,Apache通常不具有此类权限(不安全,通常不需要)


不确定它是否可以在Windows上运行,但是......它可以在Linux上运行,但Windows可能会在执行时“锁定”文件...

答案 1 :(得分:4)

试试unlink。 Web服务器用户需要对目录/脚本具有写权限。

答案 2 :(得分:4)

对其他答案的旁注:

我建议重命名文件,或在文件的开头放一个退出语句,删除是恕我直言不是一个好选择。用户可能希望读取安装脚本或重新运行它。也许这可能是一个更好的解决方案:

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

答案 3 :(得分:1)

unlink($_SERVER['SCRIPT_FILENAME']);

unlink(__FILE__);