Problemas con PHP, umask, mkdir y permisos

Supongamos que se tiene la siguiente situación:

Una aplicación Web provee al usuario la funcionalidad de subir archivos. Los archivos son guardados en disco utilizando el siguiente formato /uploads/user_<ID> donde ID es un identificador de usuario.

Desactivar safe_mode

Puede ser que la opción safe_mode de PHP esté previniendo el acceso a la carpeta, ya que puede pasar que el usuario que accede sea distinto al que lo crea.

La solución podría estar en deshabilitar safe_mode. Para esto hay que modificar el archivo php.ini y poner la entrada safe_mode=Off.

Si usas Plesk, puedes probar deshabilitar safe mode desde el panel de control de Plesk.

Usar umask

Otra razón del problema puede estar en que el usuario que crea la carpeta, tenga configurado umask con algún valor distinto de cero. Esto hace que al usar funciones como mkdir, se aplique la máscara para asignar los privilegios de lectura, escritura o ejecución.

Ejemplo, si el usuario que crea el directorio tiene por defecto un umask de 022 entonces por más que uses mkdir($upload_path, 0777), se creará una carpeta con permisos 755 en lugar de 777.

En PHP es fácil sobre-escribir provisoriamente el umask. Lo recomendable es que luego de sobreescribirlo y crear la carpeta, vuelvas a dejarlo como estaba. Esto se puede hacer de la siguiente manera:


$oldumask = umask(0);
mkdir($upload_path, 0777);
$result4 = umask($oldumask);
Comparte:
  • Print this article!
  • Digg
  • del.icio.us
  • Google Bookmarks
  • E-mail this story to a friend!
  • Technorati
  • Twitter

Artículos relacionados:

  1. La solución a los problemas de tildes y caracteres especiales con PHP y SQL Server
  2. Insertar Fecha con PHP en MySQL
  3. Enviar E-Mails con PHP usando PHPMailer
  4. Generar archivos PDF con PHP
  5. Deshabilitar safe_mode en Plesk



3 respuestas a “Problemas con PHP, umask, mkdir y permisos”

  1. ZiTAL says:

    Bastaría con:

    $oldumask = umask(0);
    mkdir($upload_path, 0777);
    umask($oldumask);

    No tienes porque asignarle una variable.

  2. Sí, tienes razón. No hay por qué asignarle la variable $result al final (quedó del código que justo estaba picando al momento de probar el “snippet”). =)
    Saludos

  3. ZiTAL says:

    De todas formas muchas gracias :)

Dejar tu comentario