Я использую 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(); }
Вы должны как-то аутентифицировать пользователя.
Ваш пользователь должен быть аутентифицирован с именем пользователя и паролем.
Сессия PHP может использоваться для запоминания, и вы должны использовать таблицу базы данных или текстовый файл на сервере для хранения информации о собственности на файл.
Затем, прежде чем отменить что-либо, ваша логика должна убедиться, что текущий «аутентифицированный» пользователь является владельцем файла.
Ограничьте выделение в каталог с фотографиями. То есть, не разрешайте ..
в пути или проверяем полный путь после выполнения realpath (). В противном случае пользователь может запросить delete_photo.php?photo_id=../../../../etc/passwd
и сломать систему.
вы можете упростить свою задачу, используя очень простую замену базы данных – структуру каталогов. хранить файлы пользователя в каталоге пользователя. поэтому вы всегда можете проверить, имеет ли конкретный пользователь права на удаление. Назовите каталог после имени пользователя, или – намного лучше – числовой идентификатор пользователя
просто что-то вроде
$photo_id = basename($_GET['photo_id'];) $filename = $filebase.$_SESSION['user_id']."/".$photo_id; if (file_exists($filename) unlink ($filename);
В вашем PHP:
В противном случае пользователи могут удалить любой файл.
Что касается собственности, вы должны хранить информацию, которая владеет файлом где-то на стороне сервера (например, MySql-DB). Затем перед удалением файла необходимо проконсультироваться с этим местом.
Как сказал Вадим М.. Вам необходимо аутентифицировать своего пользователя. Затем вы можете использовать это, чтобы сравнить «Владелец изображения» с «Пользователь, который в настоящее время входит в систему». Это даст вам всю необходимую вам безопасность.
Как я уже говорил, назовите вариблеты так, чтобы они звучали правильно. Когда я вижу «id» в varayable. Я автоматически предполагаю в качестве программиста, что это числовой var.
имели ту же проблему и обошли ее, используя функцию ftp_delete
PHP
Другое предложение: не храните файлы на диске, а помещайте их в базу данных. Это позволяет очень четко различать ваш сайт + скрипты и «пользовательские данные».
(кто-то однажды сказал мне, что файлы были файлами, а базы данных – для данных, и все они разные, но, как я вижу, файлы все равно содержат данные. mysql имеет идеальный тип LONGBLOB для ввода чего-либо, и вы можете хранить метаданные , такие как тип файла и имя файла, в отдельных полях в одной строке данных, что делает вещи чистыми и простыми)