6

我将 UNLINK 与PHP和一起使用AJAX。我知道这种方式很危险,因为每个人都可以删除任何文件。但是我需要使用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();
    }
4

7 回答 7

9

您需要以某种方式对用户进行身份验证。

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

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

然后,在取消链接之前,您的逻辑应确保当前“经过身份验证”的用户是文件的所有者。

于 2010-08-05T14:02:50.430 回答
4

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

就像

$photo_id = basename($_GET['photo_id'];)
$filename = $filebase.$_SESSION['user_id']."/".$photo_id;
if (file_exists($filename) unlink ($filename);
于 2010-08-05T14:42:14.610 回答
2

限制取消链接到包含照片的目录。即不允许..在路径中,或在执行realpath() 后检查完整路径。否则,用户可以请求delete_photo.php?photo_id=../../../../etc/passwd并破坏系统。

于 2010-08-05T14:04:47.247 回答
1

在您的 PHP 中:

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

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

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

于 2010-08-05T14:05:06.927 回答
0

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

正如我之前所说,为变量命名,使它们听起来正确。当我在变量中看到“id”时。作为一名程序员,我自动假设它是一个数字变量。

于 2010-08-05T14:13:55.310 回答
0

遇到了同样的问题并使用PHP的ftp_delete函数解决了它

于 2011-06-07T08:05:59.867 回答
-1

一个不同的建议:不要将文件存储在磁盘上,而是将它们放在数据库中。这在您的站点+脚本和“用户数据”之间保持了非常清晰的区别。

(有人曾经告诉我文件是文件,数据库是数据,它们是不同的,但在我看来,文件无论如何都包含数据。mysql 有一个完美的 LONGBLOB 类型可以放入任何东西,你可以存储元数据,例如文件类型和文件名,在同一数据行的不同字段中,这样可以保持简洁)

于 2010-08-05T14:11:41.953 回答