Pregunta

Estoy trabajando en una aplicación web PHP en un servidor web Linux para los grados y los documentos destinados a un curso que soy co-enseñanza. La página que estoy escribiendo en este momento es para las asignaciones de presentar, cuando los estudiante selecciona una misión de un menú desplegable a continuación, carga la asignación y se somete. En presenten, toda la información sobre la presentación entra en una tabla de MySQL, y el archivo se mueve a un lugar permanente en el sistema de archivos. Idealmente, esto sería algo muy organizada por la asignación, los estudiantes, y la versión, pero lo único que quiero ahora es conseguir que el archivo de carga de trabajo, en principio, por lo que por ahora se limita a enviar cosas al directorio ~ / phptest / (permisos para el cual se establecen en 755, aunque he intentado 777 sólo para pruebas, y que tampoco funcionó). Aquí está el código como está ahora:

($ dap es una instancia de una clase mango DB ampliado creé para que estas transacciones DB limpiador específico)


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 . "
\n"; } else die("File cannot exceed 1MB"); } else die("Bad file extension."); } else { // HTML to display the submission screen }

Mi problema, sin embargo, es que sólo funciona para move_uploaded_file directorios con permisos 777. Una inspección más cercana revela que esto es debido a que PHP es un material carga como el usuario 'apache', y por lo tanto no puede escribir en directorios propiedad de mi nombre de usuario con o-w. Vi soluciones publicados por los usuarios en la documentación de PHP que sugerían que el uso de chown para recuperar los archivos, pero no tienen un nivel de permisos suficientemente alta como para hacer esto. ¿Hay una solución elegante a este problema que no implique tratando de obtener mi nombre de usuario permisos superiores?

¿Fue útil?

Solución

Obtener el administrador de sistemas que le ponga en el mismo grupo de usuarios como Apache o idealmente crear un nuevo grupo llamado algo así como desarrolladores y agregue el usuario Apache y usted mismo a él.

De lo contrario, podría tratar de usar PHP chmod o chown inmediatamente después de la carga de archivos. Si ejecuta chmod($filepath, 0777); que debe ser una buena prueba de si va a trabajar para usted o no.

Otros consejos

Breve respuesta: No es una solución elegante, ya que esto es conceptualmente mal . Hay una razón por la cual el archivo es propiedad del usuario del servidor web en el primer lugar. Es el servidor web que creó el archivo (desde el punto de vista del sistema operativo), por lo que debe poseer la misma.

Respuesta larga: ¿Cuáles son las razones detrás del hecho de que usted desea que el archivo sea propiedad de otro usuario?

  1. Seguridad Bueno, tan pronto como el archivo no es propiedad del servidor web más, no puede ser sobrescrito por lo que si un atacante se hace cargo del servidor web, él o ella no puede alterar las asignaciones más. Concedido. Pero en lugar de hacer Cosas raras ™ una aplicación web debe centrarse en lo que se supone que debe hacer y asegurar el servidor web seguro que no es una de TI de tareas. Una arquitectura de la aplicación adecuada y algunas medidas de seguridad estándar deben hacer el mismo truco e intrínsecamente contener una gran cantidad más seguridad que acaba de cambiar el propietario del archivo. Si es absolutamente necesario para mover los datos alrededor, podría establecer ya sea un reloj de carpeta utilizando una herramienta como o href="http://linuxappfinder.com/package/inoticoming" rel="nofollow" title="Inotincoming documentation"> inotincoming . En caso de que sus necesidades de seguridad son altos, usted debe pensar en la implementación de un perfil SELinux en su servidor web.
  2. lógica empresarial subyacente Es una mala idea para implementar flujos de trabajo complejos por sí mismo. Si usted tiene la lógica de negocio adicional acerca de la publicación de los documentos, me gustaría sugerir el uso de cualquiera Apache Camel o Apache ServiceMix , que a su vez utiliza camello, pero ofrece una gran cantidad más características. Apache camello es un motor de Wrouting y la mediación "que se traduce aproximadamente a 'que procesa mensajes de acuerdo con Los patrones de integración empresarial . Que en los medios de giro se convierte, escisiones, enriquece, rutas o filtros de cualquier carga dada. Hay una excelente módulo de procesamiento de archivos que automatiza muchos de cosas que tiene que cuidar por sí mismo en la aplicación de la lógica de negocio (el procesamiento, la reanudación de procesamiento interrumpido, la creación de copias de seguridad y tal). Camello demasiado (aunque yo no recomendaría el uso php primer lugar, pero eso es ciertamente completamente sesgada). Puede encadenar esto con incron o inotincoming
  3. Acceso Puede ser que desea tener acceso a los archivos a través de FTP, pero no agregar el usuario ftp para el grupo de servidores web. Fácil solución: utilizar los permisos de "otros". No es que el establecimiento de un permiso de la otra emite los archivos entre internet. Asegúrate de que tienes un permiso de solo lectura para el grupo "otros" y que son buenos para ir. Otra solución podría ser la creación de un servidor FTP con usuarios virtuales.

En pocas palabras:. No es siempre una solución sin socavar el sentido, y mucho menos la aplicación de medidas de seguridad

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top