Domanda

Sto usando UNLINK con PHP e AJAX. So che in questo modo è molto pericoloso, perché tutti possono eliminare tutti i file. Ma ho bisogno di usare AJAX perché non riesco a ricaricare la pagina quando elimino i file.

Quindi, come devo fare per permettere di eliminare il file solo per l'utente che lo possiede?

Per favore fatemi sapere altre cose anche se si pensa che sto facendo qui qualcosa di sbagliato o qualcosa d'altro ciò che avete in mente e si pensa che possa essere utile:)

Codice Il mio 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);
    }


 ?>

Codice mio 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();
    }
È stato utile?

Soluzione

È necessario autenticare l'utente in qualche modo.

I tuoi esigenze degli utenti per essere autenticato con un nome utente e una password.

sessione di PHP può essere usato per ricordare, e si dovrebbe utilizzare una tabella di database o di un file di testo sul server per memorizzare le informazioni proprietà del file.

Poi, prima di scollegamento qualsiasi cosa, la logica dovrebbe fare in modo che l'utente attualmente "autenticato" è il proprietario del file.

Altri suggerimenti

È possibile semplificare la vostra attività utilizzando una semplice sostituzione del database - una struttura di directory. mantenere i file dell'utente nella directory dell'utente. così, si può sempre controllare se particolare utente ha diritti per eliminare. Nome di una directory dopo il nome dell'utente, o - molto meglio - numerico ID utente

solo qualcosa come

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

Limite della scollegamento alla directory con le foto. Cioè, non consentono .. nel percorso, o controllare il percorso completo dopo aver fatto realpath (). In caso contrario, l'utente può richiedere delete_photo.php?photo_id=../../../../etc/passwd e rompere il sistema.

Nel vostro PHP:

  • Assicurati $ _GET [ 'photo_id'] e $ _GET [ 'thumbnail_id'] non contengono" ../"
  • Inoltre assicuratevi di anteporre una BasePath all'ID.

In caso contrario, gli utenti possono eliminare qualsiasi file.

Per quanto riguarda la proprietà, è necessario memorizzare le informazioni che possiede quale file da qualche parte sul lato server (ad esempio un MySql-DB). Quindi si consiglia di consultare questa posizione prima di eliminare il file.

Come Wadih M. ha detto. È necessario autenticare l'utente. Quindi è possibile utilizzare che per confrontare il "proprietario dell'immagine" al "Utente attualmente il login". Questo vi darà tutta la sicurezza è possibile.

Come ho detto prima, il nome del varaibles in modo che suonano bene. Quando vedo "id" in un varaiable. Presumo automaticamente come programmatore che si tratta di una var numerico.

hanno avuto lo stesso problema e ha ottenuto intorno ad esso utilizzando la funzione ftp_delete di PHP

Un suggerimento diverso: non conservare i file su disco, ma metterli in una banca dati. Ciò mantiene una distinzione molto chiara tra il vostro sito + script e "dati utente".

(qualcuno una volta mi ha detto che i file sono stati i file ei database sono stati per i dati, e quelli sono diversi, ma come la vedo io, file contengono i dati in ogni caso. Mysql ha un tipo LONGBLOB perfetto per mettere qualcosa in, ed è possibile memorizzare meta-dati, come tipo di file e il nome del file, in campi separati nella stessa riga di dati, che mantiene le cose semplici e pulite)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top