Как избежать рисков безопасности 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();
    }
6
задан Brian Tompsett - 汤莱恩 8 July 2015 в 22:44
поделиться

6 ответов

Вам нужно как-то аутентифицировать пользователя.

Ваш пользователь должен быть аутентифицирован с помощью имени пользователя и пароля.

Сеанс PHP можно использовать для запоминания, и вы должны использовать таблицу базы данных или текстовый файл на сервере для хранения информации о владельце файла.

Затем, прежде чем отключать что-либо, ваша логика должна убедиться, что текущий «аутентифицированный» пользователь является владельцем файла.

9
ответ дан 8 December 2019 в 15:58
поделиться

вы можете упростить свою задачу, используя очень простую замену базы данных - структуру каталогов. хранить файлы пользователя в каталоге пользователя. Таким образом, вы всегда можете проверить, есть ли у конкретного пользователя права на удаление. Назовите каталог после имени пользователя или, что гораздо лучше, числового идентификатора пользователя

, например,

$photo_id = basename($_GET['photo_id'];)
$filename = $filebase.$_SESSION['user_id']."/".$photo_id;
if (file_exists($filename) unlink ($filename);
4
ответ дан 8 December 2019 в 15:58
поделиться

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

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

-1
ответ дан 8 December 2019 в 15:58
поделиться

В вашем PHP:

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

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

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

1
ответ дан 8 December 2019 в 15:58
поделиться

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

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

0
ответ дан 8 December 2019 в 15:58
поделиться

Ограничьте отвязку только каталогом с фотографиями. То есть не допускайте ... в пути, или проверяйте полный путь после выполнения realpath(). Иначе пользователь может запросить delete_photo.php?photo_id=.../.../.../.../etc/passwd и сломать систему.

2
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: