【问题标题】:Deleting a server file删除服务器文件
【发布时间】:2011-02-10 00:37:52
【问题描述】:

我正在寻找一种使用 PHP 从服务器中删除文件的方法。基本上我的文件以这种方式列在页面上:

<ul>
    <li><a href="delete_file.php?file=uploads/file_01.jpg">Delete File 01</a></li>
    <li><a href="delete_file.php?file=uploads/file_02.jpg">Delete File 02</a></li>
    <li><a href="delete_file.php?file=uploads/file_03.jpg">Delete File 03</a></li>
</ul>

问题是我不确定如何让我的 delete_file.php 文件正常工作。我相信它需要是这样的:

<?php 
    $path="uploads/file_01.jpg";
    if(unlink($path)) echo "File Deleted"; 
?>

...但我不确定如何让 $path 更改为我点击删除的文件。

【问题讨论】:

  • 你想要 $_GET['file'],这太疯狂了,因为我可以将文件添加到 url 并删除它。
  • 如果有人通过delete_file.php?file=delete_file.php怎么办?

标签: php file delete-file


【解决方案1】:

有时您可能希望动态创建路径。

例如,我在不同的地方使用 CMS,因此我不应该使用固定的定义。

我的项目结构:

-我的项目
|-管理员
|--应用程序
|---控制器
|-上传

$base_directory = dirname(__FILE__);
echo $base_directory; //'/home/myProject/public_html/admin/app/controlers/'

这是正在运行的 php 文件的路径。

我在'admin/app/controllers/'中的php文件

但是在'upload/'上传文件

我们需要为正确的路径删除不必要的目录。不需要上传文件夹中的文件,因此我们不需要“admin/app/controllers/”。所以我们要删除这部分。

$path = str_replace('admin/app/controllers/', '', $path);
echo $path;  //'/home/myProject/public_html/upload/myFile'

现在我们有了正确的路径,我们可以删除文件了。

if (file_exists($path)){
    if(unlink($path)){
       echo "File deleted";
    }
}else{
     echo "File is not exists";
}

【讨论】:

    【解决方案2】:

    虽然你必须非常小心地赋予用户删除文件的能力,但我会给你足够的绳索让你上吊

    定义一个包含所有将被删除的文件的基本目录

    $base_directory = '/home/myuser/';
    

    然后删除文件

    if(unlink($base_directory.$_GET['file']))
        echo "File Deleted.";
    

    【讨论】:

    • 谢谢。工作了一个款待。你的意思是不允许目录浏览?
    • 如果有人通过这个 URL 怎么办:/delete_file.php?file=../../etc/passwd
    • @user606263 不,jnpcl 表示不允许某人发布file=../../etc/apache2/apach2.conf,如果有正确的权限,将删除服务器的 Web 服务器部分的配置文件
    • @Patrick - 明白了。应该不是问题,因为除非您以管理员(我)身份登录,否则无法执行脚本。
    【解决方案3】:
    <?php
      $file_to_delete = $_GET['file'];
      if (is_file($file_to_delete)){
        echo (unlink($file_to_delete) ? "File Deleted" : "Problem deleting file";
    
      }
    ?>
    

    我不会撒谎,除了检查它是否是文件之外,我不知道清理 $_GET['file'] 的更好方法。如果这不是一个有效的方法,请专家加入。(也许遵循指导方针present in this SO topic?)

    【讨论】:

    • 如果将此功能提供给任何最终用户,您为保护自己而必须进行的消毒工作量将是荒谬的。所以我会把它留给 OP :-)
    • basename() 清除它,以防止该人输入../../someotherfile 之类的内容。
    • 另一个小问题,你忘了) 之前的;echo,但其他都很好