Как избежать рисков безопасности UNLINK в PHP?

Я использую 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:

  • Убедитесь, что $ _GET ['photo_id'] и $ _GET ['thumbnail_id'] не содержат "../"
  • Также убедитесь, что вы добавили базовый путь к идентификатору.

В противном случае пользователи могут удалить любой файл.

Что касается собственности, вы должны хранить информацию, которая владеет файлом где-то на стороне сервера (например, MySql-DB). Затем перед удалением файла необходимо проконсультироваться с этим местом.

Как сказал Вадим М.. Вам необходимо аутентифицировать своего пользователя. Затем вы можете использовать это, чтобы сравнить «Владелец изображения» с «Пользователь, который в настоящее время входит в систему». Это даст вам всю необходимую вам безопасность.

Как я уже говорил, назовите вариблеты так, чтобы они звучали правильно. Когда я вижу «id» в varayable. Я автоматически предполагаю в качестве программиста, что это числовой var.

имели ту же проблему и обошли ее, используя функцию ftp_delete PHP

Другое предложение: не храните файлы на диске, а помещайте их в базу данных. Это позволяет очень четко различать ваш сайт + скрипты и «пользовательские данные».

(кто-то однажды сказал мне, что файлы были файлами, а базы данных – для данных, и все они разные, но, как я вижу, файлы все равно содержат данные. mysql имеет идеальный тип LONGBLOB для ввода чего-либо, и вы можете хранить метаданные , такие как тип файла и имя файла, в отдельных полях в одной строке данных, что делает вещи чистыми и простыми)