2010-08-04 6 views
0

Le problèmeSupprimer les fichiers avec AJAX/PHP


Je veux supprimer un fichier avec AJAX/PHP.

Mais le php dit que le nom de fichier que j'envoie avec AJAX n'est pas un fichier, mais quand je vais directement sur le lien je peux supprimer les fichiers. Vérifiez mon PHP actuel, j'ai mis dans l'instruction IF/ELSE pour vérifier si la chaîne est un fichier avec: is_file, le résultat est false.

Sans is_file dit ceci:

Warning: unlink("image.jpg") [function.unlink]: Invalid argument in C:\wamp\www\images\users\delete.php on line 8

Le fichier qui appelle ajax est dans le dossier où se trouvent les fichiers trop ce que je veux supprimer.

Le PHP


<?php 
    // I save the file sources from the URL what was sent by AJAX to these variables. 
    $photo_id = $_GET['photo_id']; 
    $thumbnail_id = $_GET['thumbnail_id']; 

    function deletePhotos($id){ 
     // If is a file then delete the file. 
     if(is_file($id)){ 
      return unlink($id); 
     // Else show error. 
     } else { 
      echo $id . " is not a file, or there is a problem with it.<br />" ; 
     } 
    } 

    if(isset($photo_id)){ 
     deletePhotos($photo_id); 
    } 
    if(isset($thumbnail_id)){ 
     deletePhotos($thumbnail_id); 
    } 

?> 

L'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.php?photo_id=\""+photos+"\"&thumbnail_id=\""+thumbnails+"\"", true); 
     xmlhttp.send(); 
    } 
+1

S'il s'agit de votre script de production, il présente un sérieux défaut de sécurité: tout le monde peut dire au script de supprimer/dissocier tout fichier accessible en écriture sur le serveur –

Répondre

1

Votre requête ajax contient les données entre guillemets.

//Bad 
delete.php?photo_id="1234" 

//Good 
delete.php?photo_id=1234 

//So use this: 
xmlhttp.open("GET", "http://192.168.2.104/images/users/delete.php?photo_id="+photos+"&thumbnail_id="+thumbnails, true); 
+0

laissez-moi l'essayer;) – Adam

+0

Ok, je l'ai essayé, mais l'erreur se pose encore, d'autres conseils? – Adam

+0

Hmm J'ai enlevé le 'IF/THEN'statement avec' is_file' et fonctionne: |, C'est intéressant mais fonctionne: D – Adam

0
  • Vous devez donner un chemin complet is_file. Un chemin partiel comme image.jpg ne dit pas où se trouve ce fichier. Si c'est supposé être relatif à la racine du document, vous devrez le rajouter.

  • Ceci est l'un des scripts les plus dangereux que j'ai jamais vu. Vous pouvez passer n'importe quel fichier dans photo_id, et tant que le serveur web a les bonnes permissions, il le supprimera. Vous devriez au moins vous assurer que vous le restreignez pour supprimer seulement les fichiers dans un certain répertoire.

+0

Hey, j'ai mis le chemin complet dans 'is_file' même erreur. Merci de venir avec les problèmes de sécurité, je vais poser une question plus tard pour cela aussi. – Adam

0

vous pourriez avoir besoin de spécifier le chemin par exemple

 
file_exists(realpath('.') . '/' . $id); 

(en supposant que vos fichiers sont dans le même dossier que votre script) dito ce que les autres ont dit, c'est un script dangereux à moins que autre sécurité en place!

0

essayez d'utiliser la garniture dans votre poste ou obtenir variables, ex:

$photo_id=trim($_GET['blah..blah']); 

dans mon cas, le problème est $photo_id déclarations sans nom de fichier - ses renvoie quelque chose comme ça « \ nfilename », quand il devrait être 'nom de fichier' donc j'ai ajouté trim et cela a fonctionné pour moi maintenant.