Composer: allow_url_fopen, disable_functions, open_basedir

En cualquier manual básico de seguridad en PHP se indica que las instrucciones allow_url_fopen, disable_functions y open_basedir deben ser modificadas para impedir posibles brechas. El problema es que composer utiliza estas directivas de php.ini.


Los posibles errores que nos pueden dar son los siguientes

Phar::mapPhar(): open_basedir restriction in effect. 
File(/composer) is not within the allowed path(s)
require(phar://composer.phar/bin/composer): failed to open stream: 
phar error: invalid url or non-existent phar "phar://composer.phar/bin/composer" 
is_dir(): open_basedir restriction in effect. File(/.composer) is not within the allowed path(s)
Update failed (The Process class relies on proc_open, which is not available on your PHP installation.)
[Symfony\Component\Process\Exception\RuntimeException]
The Process class relies on proc_open, which is not available on your PHP installation.

La forma menos segura para tratar estos errores es poner en peligro nuestra instalación, la forma segura sería generar un script en el cual des-habilitemos estas funciones sólo para la ejecución del comando, ojo, el siguiente script requiere conexión a internet para descargar composer.phar.

#!/bin/bash

#install composer if it's missing
if [ ! -f 'composer.phar' ] ; then
  echo "Composer Not Found... installing"
  curl -sS https://getcomposer.org/composer.phar > composer.phar
  if [ $? -eq 0 ] ; then 
    echo "Installed!"
  else
    echo "Composer failed to install!";
    exit 1;
  fi
fi

#double check
if [ ! -f 'composer.phar' ] ; then
  echo "Composer failed to install!";
  exit 1;
else
  COMPOSER_HOME='/your/path/composer/home' \ 
  COMPOSER_CACHE_DIR='/your/path/composer/cache' \ 
  bash -c "php -d allow_url_fopen=1 \ 
               -d disable_functions= \ 
               -d suhosin.executor.include.whitelist=phar \
           composer.phar $@";
fi

rm composer.phar

Este script es una modificación del que podéis encontrar aquí, agregando la opción disable_functions y eliminando al final el archivo composer.phar para siempre utilizar la ultima versión y no tenerlo en nuestro código.

Comentarios