2010-08-04 81 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,现在它为我工作。