【问题标题】:file import security issue文件导入安全问题
【发布时间】:2010-01-16 12:37:11
【问题描述】:

我有一个问题

当我们给 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 或病毒,这将进入网络服务器临时目录,我们如何保护它?

什么是安全的方式?

谢谢

【问题讨论】:

    标签: php security file-upload


    【解决方案1】:

    这是安全的。至少您需要验证该文件确实是一个上传的文件,而不是像 /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);
                }
            }
        }
    ?>    
    

    【讨论】:

      【解决方案2】:

      该代码中的任何内容都不会执行该文件,因此该部分不会出现问题。至于解压后会不会出问题,那是另外一个问题。

      【讨论】:

        【解决方案3】:

        只要您不执行任何文件,并且不将它们移动到可以从外部访问它们的位置(即您网站中的文件夹),就没有安全问题,无论文件包含什么。

        您只需要非常小心,当您对文件执行任何您想要执行的操作时,不要相信以这种方式传入的任何文件。例如,永远不要执行它们。切勿将它们放在可以执行它们的位置(例如,不安全的下载目录中的.php 文件)。

        否则,这实际上取决于您要如何处理这些文件。在标准的 Linux / Apache / PHP 设置中没有快速简便的病毒检查解决方案。

        如需全面了解如何使文件上传尽可能安全,请查看this question、对其的回复,尤其是 bobince 回复中的链接。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-13
          • 2011-01-07
          • 1970-01-01
          • 2022-06-15
          • 2013-02-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多