Pergunta

Estou usando PHP e AJAX. Eu sei que dessa maneira é muito perigoso, porque todos podem excluir quaisquer arquivos. Mas eu preciso usar AJAX Porque não posso recarregar a página quando excluo os arquivos.

Então, como devo fazer para permitir excluir o arquivo apenas para o usuário que o possui?

Por favor, deixe -me saber outras coisas também se você acha que estou fazendo aqui algo errado ou outra coisa o que você tem em mente e você acha que será útil :)

Meu código 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);
    }


 ?>

Meu código 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();
    }
Foi útil?

Solução

Você precisa autenticar o usuário de alguma forma.

Seu usuário precisa ser autenticado com um nome de usuário e uma senha.

A sessão PHP pode ser usada para se lembrar e você deve usar uma tabela de banco de dados ou um arquivo de texto no servidor para armazenar informações de propriedade de arquivos.

Em seguida, antes de desligar qualquer coisa, sua lógica deve garantir que o usuário atualmente "autenticado" seja o proprietário do arquivo.

Outras dicas

Você pode simplificar sua tarefa usando uma substituição de banco de dados muito simples - uma estrutura de diretório. Mantenha os arquivos do usuário no diretório do usuário. Portanto, você sempre pode verificar se o usuário específico tem direitos para excluir. Nomeie um diretório após o nome do usuário, ou - muito melhor - ID de usuário numérico

apenas algo como

$photo_id = basename($_GET['photo_id'];)
$filename = $filebase.$_SESSION['user_id']."/".$photo_id;
if (file_exists($filename) unlink ($filename);

Limite o desconhecimento do diretório com as fotos. Isto é, não permita .. no caminho, ou verifique o caminho completo depois de fazer o RealPath (). Caso contrário, o usuário pode solicitar delete_photo.php?photo_id=../../../../etc/passwd e quebre o sistema.

Em seu PHP:

  • Certifique -se de $ _Get ['Photo_id'] e $ _Get ['Thumbnail_id'] não conter "../"
  • Além disso, certifique -se de prender um Basepath para o ID.

Caso contrário, os usuários podem excluir qualquer arquivo.

Quanto à propriedade, você deve armazenar as informações que possuem qual arquivo em algum lugar do lado do servidor (por exemplo, um MySQL-DB). Em seguida, você deve consultar este local antes de excluir o arquivo.

Como Wadih M. disse. Você precisa autenticar seu usuário. Em seguida, você pode usá -lo para comparar o "Proprietário da imagem" com o "Usuário atualmente login". Isso lhe dará toda a segurança que você deseja.

Como eu disse antes, nomeie os Varaibles para que pareçam certos. Quando vejo "ID" em uma varaável. Eu assumo automaticamente como programador que é um VAR numérico.

tiveram o mesmo problema e a contornaram usando o PHP ftp_delete função

Uma sugestão diferente: não armazene arquivos no disco, mas coloque -os em um banco de dados. Isso mantém uma distinção muito clara entre o seu site+scripts e "dados do usuário".

(Alguém me disse uma vez que os arquivos eram arquivos, e os bancos de dados eram para dados, e esses são diferentes, mas, como eu os vejo, os arquivos contêm dados de qualquer maneira. MySQL tem um tipo de longbob perfeito para colocar qualquer coisa e você pode armazenar metadados , como o tipo de arquivo e o nome do arquivo, em campos separados na mesma linha de dados, o que mantém as coisas limpas e simples)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top