Как мне обойти Apache, владеющий файлами, загруженными на веб-сервер PHP? - PullRequest
0 голосов
/ 06 августа 2010

Я работаю над веб-приложением PHP на веб-сервере Linux для оценок и документов для курса, который я преподаю. Страница, которую я сейчас пишу, предназначена для отправки заданий, где студент выбирает задание из выпадающего меню, а затем загружает задание и отправляет. При отправке вся информация о представлении попадает в таблицу MySQL, и файл перемещается в постоянное место в файловой системе. В идеале это должно быть что-то очень организованное по назначению, студенту и версии, но все, что я хочу сейчас, - это чтобы загрузка файла работала в принципе, так что сейчас он просто отправляет материал в каталог ~ / phptest / (разрешения для которого установлены на 755, хотя я пробовал 777 только для испытаний, и это тоже не сработало). Вот код, как сейчас:

($ dbh - это экземпляр расширенного класса дескриптора БД, который я создал, чтобы сделать эти конкретные транзакции БД более чистыми)


if(isset($_POST['submit'])) {
    $assignmentID = $_POST['assID'];
    $tmp = "/home/username/phptest/"; 
    $info = pathinfo($_FILES['file']['name']);
    $filename = $info['basename'];
    $ext = $info['extension'];
    if(1) { //strcmpall($ext,array('tar.gz','zip'))) {
        if($_FILES['file']['size'] < 1000000) {
            $path = $tmp . $filename;
            if(move_uploaded_file($_FILES['file']['tmp_name'], $path)) {
                $versionQuery = $dbh->select(array('version'),array('a01_submissions'),array("studentID='$studentID'","assignmentID='$assignmentID'"));
                if(count($versionQuery)) {
                    $versionArray = $dbh->colToArray($versionQuery,'version');
                    $version = max($versionArray)+1;
                }
                else $version = 1;
                echo "Version $version.\n";
                $week = $dbh->getOne('week','a01_assignments','id',$assignmentID);
                $dbh->insert("a01_submissions",array('studentID','assignmentID','version','filePath'),array($studentID,$assignmentID,$version,addslashes($newpath)));
                echo "File $filename sucessfully uploaded and stored at $newpath.\n";
            }
            else echo $moved . "<br/>\n";
        }
        else die("File cannot exceed 1MB");
    }
    else die("Bad file extension.");
} 
else { 
// HTML to display the submission screen
}

Однако моя проблема в том, что move_uploaded_file работает только для каталогов с разрешениями 777. При ближайшем рассмотрении выясняется, что это происходит потому, что PHP загружает данные как пользователь 'apache' и поэтому не может записывать в каталоги, принадлежащие моему имени пользователя, с помощью o-w. Я видел решения, опубликованные пользователями в документах PHP, которые предлагали использовать chown для восстановления файлов, но у меня недостаточно высокий уровень разрешений для этого. Есть ли элегантное решение этой проблемы, которое не предполагает попытки получения более высокого разрешения для моего имени пользователя?

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

Заставьте системного администратора поместить вас в ту же группу пользователей, что и apache, или в идеале создать новую группу, называемую разработчиками, и добавить в нее пользователя apache и себя.

В противном случае вы можете попробовать использовать PHP * 1003.* chmod или chown функционирует сразу после загрузки файла.Если вы запустите chmod($filepath, 0777);, это будет хорошим тестом на то, будет ли он работать на вас или нет.

0 голосов
/ 23 апреля 2014

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

Длинный ответ: Каковы причины того, что вы хотите, чтобы файл принадлежал другому пользователю?

  1. Безопасность Что ж, если файл больше не принадлежит веб-серверу, он не может быть перезаписан им, поэтому, если злоумышленник захватит веб-сервер, он или она не сможет изменить назначения больше. Предоставляется. Но вместо того, чтобы делать Weird Stuff ™, веб-приложение должно сосредоточиться на том, что оно должно делать, и защита веб-сервера, безусловно, не является одной из его задач. Надлежащая архитектура приложения и некоторые стандартные меры безопасности должны выполнять тот же трюк и по своей сути содержать намного больше защиты, чем просто смена владельца файла. Если вам абсолютно необходимо перемещать данные, вы можете настроить папку наблюдения, используя инструмент, подобный incron или inotincoming . В случае, если ваши требования безопасности высоки, вам следует подумать о реализации профиля SELinux на вашем веб-сервере.
  2. Основополагающая бизнес-логика Это плохая идея, чтобы реализовать сложные рабочие процессы самостоятельно. Если у вас есть дополнительная бизнес-логика в отношении обработки документов, я бы предложил использовать Apache Camel или Apache Servicemix , который, в свою очередь, использует Camel, но предоставляет гораздо больше функций. Apache верблюд - это механизм обработки и посредничества », что примерно означает« обрабатывает сообщения в соответствии с шаблонами интеграции предприятия ». Это, в свою очередь, означает, что он преобразует, разбивает, обогащает, направляет или фильтрует любую полезную нагрузку. Существует отличный модуль обработки файлов , который автоматизирует множество вещей, которые вы должны позаботиться о себе при реализации бизнес-логики (обработка, возобновление прерванной обработки, создание резервных копий и тому подобное). Camel тоже поддерживает php (хотя я бы не рекомендовал использовать php в первую очередь, но это, по общему признанию, предвзято). Вы можете связать это с помощью incron или inotincoming
  3. Доступ Возможно, вы хотите получить доступ к этим файлам через ftp, но не можете добавить пользователя ftp в группу веб-серверов. Простое решение: используйте разрешения «другие». Дело не в том, что установка чужого разрешения транслирует файлы в интернет. Убедитесь, что у вас есть разрешение только на чтение для набора «другие», и вы готовы к работе. Другим решением может быть настройка ftp-сервера с виртуальными пользователями.

Итог: есть всегда решение, не подрывающее смысла, а тем более реализацию мер безопасности.

...