2010-01-16 69 views
1

我有一个问题文件导入安全问题

当我们给web用户导入数据到mysql表的选项时,这是安全的吗?

例如

<form method="post" action="import.php" enctype="multipart/form-data"> 

    <input id="file1" name="file1" type="file"> 

<input type="submit" name="button" id="button" value="Submit" > 
    </form> 

和import.php我们下面的代码

 <?php 
     $theFile = $_FILES['file1']; 
     $tmp_name1 = $theFile['tmp_name']; 
     $row = 1; 
     if (($handle = fopen($tmp_name1, "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
     $num = count($data); 

     // SQL insert statement 
     } 
     fclose($handle); 
     } 

我的问题是,如果有一个人上传任何脚本或.exe或病毒,这将去Web服务器临时目录如何保护它?

什么将安全的方式?

感谢

回答

2

那就是不是安全。至少你需要验证该文件确实是一个上传的文件,而不是像/ etc/passwd那样已经存在于服务器上的文件。要做到这一点,你需要使用is_uploaded_file()

例子:

<?php 
if (is_uploaded_file($_FILES['file1']['tmp_name'])) { 
    $tmp_name1 = $_FILES['file1']['tmp_name']; 
    if (($handle = fopen($tmp_name1, "r")) !== FALSE) { 
     while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
      $num = count($data); 

      // SQL insert statement 
     } 
    fclose($handle); 
    } 
} 

>

也如果有人执行上的文件应该重命名上传到服务器,让文件保持不变可能导致远程文件攻击的名称的任何文件,你的?服务器。

最后,如果上传文件只应该接受某些文件类型,如图像,那么你一定要检查,以确保该文件实际上是一个图像。至少,检查文件的扩展名,以确保它是为.png,.gif,.jpg和等,如果它是那么的.exe立即拒绝它,因为它显然不是一个图像,因而没有用的你。

<?php 
    if (is_uploaded_file($_FILES['file1']['tmp_name'])) { 

     $allowedExtensions = array("txt","csv","htm","html","xml","css","doc","xls","rtf","ppt","pdf","swf","flv","avi","wmv","mov","jpg","jpeg","gif","png"); 
     if (!in_array(end(explode(".", strtolower($_FILES['file1']['name']))), $allowedExtensions)) { 
      // Bad file type. Error! 
     } 
     else { 
      $tmp_name1 = $_FILES['file1']['tmp_name']; 
      if (($handle = fopen($tmp_name1, "r")) !== FALSE) { 
       while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
        $num = count($data); 

        // SQL insert statement 
       } 
       fclose($handle); 
      } 
     } 
    } 
?>  
0

在该代码没有执行该文件,因此不会有在该部分的问题。至于文件解压后是否会有问题,这是一个单独的问题。

0

只要你不执行任何文件,不把它们移动到它们可以从外部访问的位置(即在您的网站上的一个文件夹),不存在安全问题,无不管文件包含什么内容。

你只需要非常小心,而不是相信进来这种方式,当你做whatevwer你想要做的文件的任何文件。例如,不要执行它们。切勿将它们放到可执行的位置(例如,.php文件位于不安全的下载目录中)。

否则,它真的取决于你想要对文件做什么。在标准的Linux/Apache/PHP设置中没有快速简单的病毒检查解决方案。

关于什么可以做,以使文件上传尽可能的安全,请this question,回复与特别是链接bobince的答复完全破败。