文件导入安全问题

时间:2010-01-16 12:37:11

标签: php security file-upload

我有一个问题

当我们向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服务器临时目录我们如何保护它?

什么是安全的方式?

由于

3 个答案:

答案 0 :(得分: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);
    }
}

&GT?;

您还应该重命名上传到服务器的任何文件,因为保持文件名不变可能导致远程文件攻击,而有人在您的服务器上执行该文件。

最后,如果文件上传只是接受某些文件类型,如图像,那么你一定要检查以确保文件实际上是一个图像。至少检查文件扩展名以确保它是.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);
            }
        }
    }
?>    

答案 1 :(得分:0)

该代码中没有任何内容执行该文件,因此该部分不会出现问题。至于提取文件后是否会出现问题,这是一个单独的问题。

答案 2 :(得分:0)

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

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

否则,它实际上取决于您要对文件执行的操作。在标准的Linux / Apache / PHP设置中没有快速简便的病毒检查解决方案。

有关如何使文件上传尽可能安全的完整纲要,请查看this question,对其的回复,特别是bobince的回复中的链接。