1. Move_uploaded_file y safe_mode: SAFE MODE Restriction in effect.

Tenía una galería muy mona de fotos que funcionaba bien en local pero se ha ido al traste en producción.

Los hechos

El código que viene a continuación es un ejemplo que ilustra este problema. En realidad, para subir fotos al servidor, no utilizo la función copy(), sino que, por cuestiones de seguridad, uso la función move_uploaded_file(), como recomiendan aquí.

La acción A (empresas_controller.php) ejecuta este código:


mkdir('/var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta');

chmod('/var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta', 0777);

Y la acción B (categorias_controller.php), ejecuta este otro:


mkdir('/var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta/misubcarpeta');

chmod('/var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta/misubcarpeta', 0777);

copy( '/var/www/vhosts/midominio.com/httpdocs/app/webroot/img/barco.jpg','/var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta/misubcarpeta');

El herror espantoso

SAFE MODE Restriction in effect.  The script whose uid is 10013 is not allowed to access /var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta owned by uid 48 [APP/controllers/categorias_controller.php, line 54]

El motivo

Después de haber leído lo que el tiempo me ha dejado acerca del modo seguro de PHP, he entendido que el sistema tipo Unix de mi servidor compartido asigna el uid 10013 a empresas_controller.php y el 48 a la carpeta /var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta.

Como el PHP se ejectua en modo seguro, en el momento en que el script categorias_controller.php ejecuta la instrucción


mkdir('/var/www/vhosts/midominio.com/httpdocs/app/webroot/img/micarpeta/misubcarpeta');

el intérprete de PHP lanza el error porque ve que los identificadores 48 y 10013 no coinciden.

Es decir, tal y como explica el manual de php, cuando el modo seguro está activado, PHP comprueba si los directorios y archivos que utiliza el script tienen el mismo UID que éste. Efectivamente, los uid no coinciden e inicialmente uno puede pensar, como yo, que la acción cuyo propietario es 10013 (uno mismo) intenta acceder a la carpeta que pertenece a 48 (uno mismo, también).

“¿Pero por qué, si soy el mismo?” Pues no. Finalmente resulta que la instrucción mkdir, que utiliza el script PHP, crea un directorio nuevo en el sistema de archivos tipo Unix de mi servidor compartido y el sistema le asigna mi identificador de usuario Apache: 48. Por otra parte, como todos mis scripts de la carpeta /var/www/vhosts/midominio.com/ están ahí gracias al servidor FTP de mi proveedor -y al cliente que utilizo para subirlos- el uid que tienen asignado es el de mi identificador de usuario FTP.

Conclusión

Esto es lo que más o menos creo haber entendido. Se me escapan muchas cosas porque no sé configurar un servidor Apache ni un servidor FTP. El caso es que no puedo implementar mi galería de fotos porque tiene una acción CakePHP que crea carpetas en un directorio y los usuarios no pueden tener su propia carpeta multimedia porque PHP se ejecuta en modo seguro. ¿Qué hago?

Anuncios

3 comentarios

  1. Si tienes acceso ssh al servidor puedes usar chown para cambiar los propietarios de las carpetas y tengas acceso a las mismas.

    Saludos

  2. Muchas gracias, David

    Tengo acceso ssh al servidor e intento cambiar los propietarios de las carpetas con chown. Voy a ver cómo se hace. ¡Un saludo!

  3. Hola de nuevo,

    Finalmente, no estoy tan seguro de tener acceso ssh al servidor -en el panel de administración tengo deshabilitada la opción SSH e intenté, por otra parte, conectarme con putty desde un Windows Vista- y creo resolver esto así:

    $nombreAutomaticoFoto1 = ‘foto1-‘.$idEmpresaRecienGuardada.’.’.$this->extraerExtension($this->data[‘Empresa’][‘foto1’][‘name’]);

    Por cuestiones de seguridad, como recomiendan en algunos sitios que he consultado, genero nombres automáticos para los archivos que los usuarios suben al servidor y aprovecho este momento para añadir el identificador de la empresa al nombre del archivo. De esta forma, en vez de tener una estructura de directorios con carpetas cuyo nombre es el identificador de la empresa, tengo una sola carpeta con archivos que incorporan el identificador de la empresa en su nombre.

    Otra solución que creo que seguramente puede servir, aunque no la he probado, es la que explican en http://foro.hospedajeydominios.com/showthread.php?t=1952. ¿Alguien se atreve a comentar sus ventajas e inconvenientes? No me acaba de quedar clara esta conexión FTP cada vez que el sistema tiene que crear una nueva carpeta.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: