Utilizando open_basedir

Como he comentado en algunos post anteriores sobre seguridad en PHP, es muy recomendable tener configurado open_basedir. Recomiendo leer el manual oficial de PHP para tener una idea de la funcionalidad básica de esta directiva de configuración, Aquí plantearé otras preguntas diferentes.

  1. ¿Se pueden agregar unidades de red a los directorios en open_basedir? ¿Requieren alguna notación específica?
  2. ¿Los directorios son recursivos?
  3. ¿Pueden agregarse varias carpetas?

Unidades de red con open_basedir

Si es posible configurar unidades de red y es muy recomendable en vez de utilizar el nombre de la máquina utilizar su IP. No es necesario poner el caracter especial $ detrás del recurso compartido y para evitar errores del tipo open_basedir restriction in effect is not within the allowed path(s) en vez de especificar en la directiva el directorio concreto debemos poner la raíz. Ahora vamos con un ejemplo.

Imaginemos que tenemos en la máquina 127.0.0.1 que se llama PERSONAL una capeta compartida llamada archivos y que queremos que PHP acceda a una subcarpeta llamada adjuntos. Podríamos pensar que en el php.ini deberíamos poner lo siguiente:

\\PERSONAL\archivos$\adjuntos\

Pues no, esta configuración no funcionaría lo correcto es

\\\127.0.0.1\archivos

Repito los tips a tener en cuenta:

  1. la ruta de la unidad compartida debe comenzar con 3 barras \ (constante DIRECTORY_SEPARATOR en PHP según el sistema operativo)
  2. debe tener la IP de la maquina a conectar
  3. debe apuntar a la raíz del recurso compartido no a subcarpetas
  4. no debe llevar $ para identificar que es un recurso de red

Aquí os dejo un pequeño script que os puede ayudar a probar la configuración de esta directiva:

$directorios = explode(PATH_SEPARATOR, ini_get('open_basedir'));
foreach ($directorios as $directorio){
	$directorio .= sprintf("%s%u%s",
			DIRECTORY_SEPARATOR,
			strtotime("now"),
			DIRECTORY_SEPARATOR
	);
	if(!is_dir($directorio)){
		echo "no es directorio {$directorio}";
		$padre = dirname($directorio);
		if(is_writable($padre)){
			echo "permisos de escritura habilitados en {$padre}";
			if(mkdir($directorio)){
				echo "creado directorio {$directorio}";
				if(rmdir($directorio)){
					echo "borrado directorio {$directorio}";
				}
				else{
					echo "no borrado directorio {$directorio}";
				}
			}
			else{
				echo "no creado directorio {$directorio}";
			}
		}
		else{
			echo "permisos de escritura deshabilitados en {$padre}";
		}
	}
	else{
		echo "es directorio {$directorio}";
		if(rmdir($directorio)){
			echo "borrado directorio {$directorio}";
		}
		else{
			echo "no borrado directorio {$directorio}";
		}
	}
}

Recursividad de los directorios

Al escribir la ruta de un directorio si esta termina en DIRECTORY_SEPARATOR entonces sólo incluye ese directorio, por el contrario, si no termina en DIRECTORY_SEPARATOR entonces incluirá todos los subdirectorios del mismo.

Múltiples carpetas en open_basedir

Es posible incluir múltiples carpetas en esta directiva, todas separadas por el caracter PATH_SEPARATOR que depende de cada sistema operativo, en Windows es ; y en Unix :.

Pueden convivir perfectamente carpetas locales como unidades de red.

Con estas notas debería quedar configurado correctamente PHP ya lo único que faltaría es tener permisos en esas carpetas, sino tendremos el error Permission denied.

Comentarios