предотвратить подделку пантомимы при загрузке php - PullRequest
0 голосов
/ 24 сентября 2008

Есть ли способ запретить кому-либо подделывать mime-тип при загрузке файла, а затем запускать php / exe / etc ...

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

Я впервые использую загрузку файлов с помощью php и пытаюсь охватить все вопросы безопасности.

Ответы [ 4 ]

2 голосов
/ 24 сентября 2008

Каталог загрузки файлов не должен быть доступен для веб-браузера. То есть не позволяйте кому-либо загружать файл, скажем «remove_all_my_files.php», а затем запустить его в вашей системе, указав ему URL, например «http://xample.com/uploads/remove_all_my_files.php».

0 голосов
/ 24 сентября 2008

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

Вот основная идея:

function ReadAndOutputFileChunked ($filename) { 
    $chunksize = 1*(1024*1024); // how many bytes per chunk 
    $buffer = ''; 
    $handle = @fopen($filename, 'rb'); 
    if ($handle === false) { 
        return false; 
    } 
    while (!feof($handle)) { 
        $buffer = @fread($handle, $chunksize); 
        print $buffer; 
    } 
    return @fclose($handle); 
}

header("Content-type: application/octet-stream");
ReadAndOutputFileChunked('/private/path/to/upload/files/' . $nameOfFile);
0 голосов
/ 24 сентября 2008

В конфигурации моего веб-сервера Apache я не верю, что фактическое содержимое файла определяет, будет ли файл работать как скрипт или нет. Определение того, следует ли отображать файл в текстовом или графическом формате или запускать его в качестве сценария, принимается путем сопоставления конца файла.

Например, директива в файле конфигурации apache, httpd.conf

Приложение AddType / x-httpd-php .php

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

0 голосов
/ 24 сентября 2008

Информация в $_FILES всегда поступает от клиента, поэтому вам нужно принять файл и отсканировать его на сервере. Я бы либо порекомендовал использовать finfo , который является расширением PHP и облегчает его:

<?php
// example :-)
$finfo = finfo_open(FILEINFO_MIME);
echo finfo_file($finfo, '/path/to/your/upload/file);
finfo_close($finfo);
?>

Существует также OO-интерфейс, если вам не нравится процедурный.

Если finfo не является опцией, вы можете использовать команду unix file для проверки.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...