如何避免PHP中的UNLINK安全风险?

时间:2010-08-05 14:01:00

标签: php ajax security unlink delete-file

我正在使用UNLINK与PHPAJAX。我知道这种方式非常危险,因为每个人都可以删除任何文件。但我需要使用AJAX因为删除文件时无法重新加载页面。

那么我应该如何才允许仅为拥有该文件的用户删除该文件?

如果您认为我在这里做错了什么或其他什么事情,请让我知道其他事情,并且您认为它会有用:)

我的PHP代码:


<?php

    $photo_id       = $_GET['photo_id'];
    $thumbnail_id   = $_GET['thumbnail_id'];    

    function deletePhotos($id){
        return unlink($id);
    }

    if(isset($photo_id)){
        deletePhotos($photo_id);
    }
    if(isset($thumbnail_id)){
        deletePhotos($thumbnail_id);
    }


 ?>

我的AJAX代码:


function deletePhoto(photo, thumbnail){

        var photos = encodeURIComponent(photo);
        var thumbnails = encodeURIComponent(thumbnail);

        if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
        } else {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
        }

        xmlhttp.onreadystatechange=function() {
            if (xmlhttp.readyState==4 && xmlhttp.status==200) {
                document.getElementById("media").innerHTML=xmlhttp.responseText;
            }
        }
        xmlhttp.open("GET", "http://192.168.2.104/images/users/delete_photo.php?photo_id="+photos+"&thumbnail_id="+thumbnails, true);
        xmlhttp.send();
    }

7 个答案:

答案 0 :(得分:7)

您需要以某种方式验证用户。

您的用户需要使用用户名和密码进行身份验证。

可以使用PHP会话记住,您应该使用服务器上的数据库表或文本文件来存储文件所有权信息。

然后,在取消链接任何内容之前,您的逻辑应该确保当前“已验证”的用户是该文件的所有者。

答案 1 :(得分:3)

您可以使用非常简单的数据库替换 - 目录结构来简化您的任务。将用户的文件保存在用户的目录中。因此,您始终可以检查特定用户是否有权删除。在用户名后命名目录,或者 - 更好 - 数字用户ID

就像是

$photo_id = basename($_GET['photo_id'];)
$filename = $filebase.$_SESSION['user_id']."/".$photo_id;
if (file_exists($filename) unlink ($filename);

答案 2 :(得分:2)

使用照片限制取消链接到目录。也就是说,不要在路径中允许..,或者在执行realpath()后检查完整路径。否则,用户可以请求delete_photo.php?photo_id=../../../../etc/passwd并中断系统。

答案 3 :(得分:1)

在你的PHP中:

  • 确保$ _GET ['photo_id']和$ _GET ['thumbnail_id']不包含“../"
  • 还要确保在ID之前添加了一个基本路径。

否则用户可以删除任何文件。

对于所有权,您必须存储在服务器端某处拥有哪个文件的信息(例如MySql-DB)。然后,您应该在删除文件之前查阅此位置。

答案 4 :(得分:0)

正如Wadih M.所说。您需要对用户进行身份验证。然后,您可以使用它来比较“图像的所有者”和“用户当前登录”。这将为您提供所需的所有安全保障。

正如我之前所说的那样,将可变声音命名为正确。当我在可变的时候看到“id”。我自动假设它是程序员,它是一个数字变量。

答案 5 :(得分:0)

遇到了同样的问题,并使用PHP的ftp_delete函数

解决了这个问题

答案 6 :(得分:-1)

一个不同的建议:不要将文件存储在磁盘上,而是将它们放在数据库中。这样可以清楚地区分您的站点+脚本和“用户数据”。

(曾经有人告诉我文件是文件,数据库是数据,而且不同,但正如我所看到的,文件包含数据.mysql有一个完美的LONGBLOB类型可以放入任何东西,你可以存储元数据,例如文件类型和文件名,位于同一数据行的不同字段中,这样可以保持简洁明了)