проблема безопасности импорта файлов - PullRequest
1 голос
/ 16 января 2010

у меня один вопрос

когда мы даем возможность веб-пользователю импортировать данные в таблицу 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, или вирус, он попадет во временный каталог веб-сервера, как мы можем его обезопасить?

какой будет безопасный путь?

Спасибо

Ответы [ 3 ]

2 голосов
/ 16 января 2010

То есть не безопасный. По крайней мере, вам нужно убедиться, что файл действительно был загруженным файлом, а не файлом, уже существующим на сервере, например / 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 голосов
/ 16 января 2010

Пока вы не выполняете никаких файлов и не перемещаете их в место, к которому они могут быть доступны извне (то есть в папку на вашем веб-сайте), проблем с безопасностью не возникает, независимо от того, что содержат файлы.

Вам просто нужно быть очень осторожным и не доверять никаким файлам, которые поступают таким образом, когда вы делаете то, что хотите с файлами. Никогда не выполняйте их, например. Никогда не помещайте их в место, из которого они могут быть выполнены (например, .php файлы в незащищенном каталоге загрузки).

В противном случае, это действительно зависит от того, что вы хотите сделать с файлами. В стандартной установке Linux / Apache / PHP нет простого и быстрого решения для проверки на вирусы.

Для полного изложения того, что можно сделать, чтобы загрузка файлов была максимально безопасной, ознакомьтесь с этим вопросом , ответами на него и особенно ссылкой в ​​ответе Бобинса

0 голосов
/ 16 января 2010

Ничто в этом коде не выполняет файл, поэтому в этой части не будет проблем. Что касается того, возникнет ли проблема после извлечения файла, это отдельная проблема.

...