2010-08-04 106 views
0

問題刪除文件與AJAX/PHP


我想刪除一個文件AJAX/PHP

但php說,我用AJAX發送的文件名不是文件,但是當我直接進入鏈接時,我可以刪除這些文件。看看我當前的PHP,我已經在IF/ELSE語句中檢查字符串是否是一個文件:is_file,結果是false

沒有is_file這樣說:

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

文件什麼叫Ajax的就是太是文件,我想刪除什麼文件夾內。

的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); 
    } 

?> 

的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

如果這是你的生產腳本,它有一個嚴重的安全缺陷:任何人都可以告訴腳本刪除/取消鏈接服務器上的任何可寫文件 – 2010-08-04 21:52:31

回答

1

您的ajax請求包含引號中的數據。

//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

讓我試試;) – Adam 2010-08-04 20:22:00

+0

好吧,我試過了,但錯誤仍然出現,任何其他提示? – Adam 2010-08-04 20:29:21

+0

嗯我用'is_file'刪除了'IF/THEN'語句,並且工作原理:|,這很有趣但是工作原理:D – Adam 2010-08-04 20:34:45

0
  • 你需要給一個完整路徑is_file。像image.jpg這樣的部分路徑不會告訴它該文件位於何處。如果它應該是相對於文檔根目錄的,那麼你需要預先考慮它。

  • 這是我見過的最危險的腳本之一。您可以將任何文件傳遞到photo_id,並且只要Web服務器具有正確的權限,就會將其刪除。你至少應該確保你限制它只刪除某個目錄中的文件。

+0

嘿,我已經把完整路徑放在'is_file'中,但我有同樣的錯誤。感謝您提出安全問題,我也會在稍後提出一個問題。 – Adam 2010-08-04 20:23:02

0

您可能需要指定例如路徑

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

(假設你的文件在同一文件夾中的腳本)同上所說的話別人,這是一個危險的腳本,除非有其他安全就位!

0

嘗試用裝飾在您的文章或獲取變量,例如:

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

在我的情況下,問題是$photo_id回報沒有文件名 - 它的回報是這樣的「\ nfilename」,當它應該是'文件名',所以我加了trim,現在它爲我工作。