我正在使用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();
}
答案 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中:
否则用户可以删除任何文件。
对于所有权,您必须存储在服务器端某处拥有哪个文件的信息(例如MySql-DB)。然后,您应该在删除文件之前查阅此位置。
答案 4 :(得分:0)
正如Wadih M.所说。您需要对用户进行身份验证。然后,您可以使用它来比较“图像的所有者”和“用户当前登录”。这将为您提供所需的所有安全保障。
正如我之前所说的那样,将可变声音命名为正确。当我在可变的时候看到“id”。我自动假设它是程序员,它是一个数字变量。
答案 5 :(得分:0)
遇到了同样的问题,并使用PHP的ftp_delete
函数
答案 6 :(得分:-1)
一个不同的建议:不要将文件存储在磁盘上,而是将它们放在数据库中。这样可以清楚地区分您的站点+脚本和“用户数据”。
(曾经有人告诉我文件是文件,数据库是数据,而且不同,但正如我所看到的,文件包含数据.mysql有一个完美的LONGBLOB类型可以放入任何东西,你可以存储元数据,例如文件类型和文件名,位于同一数据行的不同字段中,这样可以保持简洁明了)