Administración PHP - Noviembre 2005

Página creada Jaime Francés
 
SEGUIR LEYENDO
Administración PHP - Noviembre 2005
Administración PHP

                       Noviembre 2005

                           Jordi Llonch
                         jordi@laigu.net

        http://creativecommons.org/licenses/by-sa/2.0/
Administración PHP

Índice

         • Instalación

         • Configuración

         • Monitoraje

         • Seguridad

         • Consideraciones al programador

         • Recursos

                                                2
Administración PHP

Instalación
• Instalación general en un sistema Fedora Core 3:
       – rpm -i php-4.3.9-3.i386.rpm

       – rpm -i php-mysql-4.3.9-3.i386.rpm

       – rpm -i php-pear-4.3.9-3.i386.rpm

       – Estos paquetes instalarán el intérprete de PHP y configurarán
           Apache para la ejecución de PHP como módulo:
               • /etc/httpd/conf.d/php.conf
               • AddType application/x-httpd-php .php

               • AddType application/x-httpd-php-source .phps

               • LoadModule php4_module modules /libphp4.so

               • DirectoryIndex index.php

               •

                                                                         3
Administración PHP

Instalación PEAR
• Instalación de las librerías PEAR:
         – Utilizaremos los siguientes comandos:
     •
                 • Ver paquetes instalados:
                 •   # pear list
                 •
                 •   INSTALLED PACKAGES:
                 •   = = = = = = = = = = = = =
                 •   PACKAGE        VERSION STATE
                 •   Archive_Tar    1.1     stable
                 •   Console_Getopt 1.2     stable
                 •   DB             1.6.2   stable
                 •   Mail           1.1.3   stable
                 •   ...
                 •
                 • Ver la lista de paquetes disponibles:
                 •   # pear list-all
                 •
                 • Actualizar todos los paquetes:
                 •   # pear upgrade-all
                 •
                 • Instalar un paquete:
                 •   # pear install PAQUETE
                 •
                 •

                                                           4
Administración PHP

Instalación PEAR
• Comprobar la instalación de PEAR:
       – Crearemos el siguiente script PHP:
               •
               • 
               •

                                                 5
Administración PHP

Configuración: El archivo de configuración
• El archivo de configuración (llamado php.ini a partir de PHP 4.0)

       – Leído cuando arranca PHP:

               • Para las versiones como módulo de servidor esto sólo ocurre una
                   vez al arrancar el servidor web.

               • Para la versión CGI, esto ocurre en cada llamada.

                                                                                   6
Administración PHP

Configuración: Directivas generales
•   asp_tags boolean
         – Permite el uso de las etiquetas estilo ASP  además de las habituales
             etiquetas . También se incluye el atajo para imprimir variables <
             %= $valor %>.
•   auto_append_file string
         – Especifica el nombre de un archivo que es incluido automáticamente después
              del archivo principal. El archivo se incluye como si fuese llamado mediante
              la función include(), así que se utiliza include_path.
         – El valor especial none desconecta la adición automática de archivos.
         – Nota: Si el script es terminado con exit(), no tendrá lugar la adición automática.
•   auto_prepend_file string
          – Especifica el nombre de un archivo que es incluido automáticamente antes
               del archivo principal. El archivo se incluye como si fuese llamado mediante
               la función include(), así que se utiliza include_path.
          – El valor especial none desconecta la adición automática de archivos.

                                                                                                7
Administración PHP

Configuración: Directivas generales
•   doc_root string

        – "Directorio raiz" de PHP en el servidor. Sólo se usa si no está vacío. Si PHP
             se configura con safe_mode, no se sirven archivos fuera de este
             directorio.

•   engine boolean

        – Esta directiva sólo es útil en la versión de PHP como módulo Apache. Se
             utiliza para sitios que desean habilitar la ejecución del PHP directorio por
             directorio o en base a cada servidor virtual. Poniendo php_engine off
             en los sitios apropiados del archivo httpd.conf, se puede habilitar o
             deshabilitar PHP.

                                                                                            8
Administración PHP

Configuración: Directivas generales
•   open_basedir string
        –   Limita los archivos que se pueden abrir por PHP al árbol de directorios especificado.
        –   Cuando un script intenta abrir un archivo con, por ejemplo, fopen o gzopen, se
               comprueba su localización. Si el fichero está fuera del árbol de directorios
               especificado, PHP se negará a abrirlo. Todos los enlaces simbólicos son resueltos,
               de modo que no es posible evitar esta limitación usando uno de ellos.
        –   El valor especial . indica que el directorio base será aquel en el que reside el script.
        –   Bajo Windows, separe los directorios mediante punto y coma. En el resto de sistemas,
               sepárelos con dos puntos ":". Como módulo de Apache, los senderos para
               open_basedir de los directorios padre se heredan automáticamente.
        –   El valor por defecto es permitir abrir todos los archivos.
•   gpc_order string
        –   Fija el order de parseo de variables GET/POST/COOKIE. El valor por defecto de esta
                directiva es "GPC". Fijándola, por ejemplo, a "GP", hará que PHP ignore por
                completo las cookies y que sobreescriba las variables recibidas por GET con las que
                tengan el mismo nombre y vengan por POST.
•   ignore_user_abort string
        –   Por defecto está a on. Si se cambia a off, los script terminarán tan pronto como intenten
               enviar algo después de que un cliente ha parado la conexión.

                                                                                                        9
Administración PHP

Configuración: Directivas generales
•   include_path string
        – Especifica una lista de directorios en los que las funciones require(), include() y
             fopen_with_path() buscan los archivos. El formato es similar a la variable de
             entorno de sistema PATH: una lista de directorios separados por dos puntos en
             UNIX o por punto y coma en Windows.
•   magic_quotes_gpc boolean
        – Fija el estado magic_quotes para operaciones GPC (Get/Post/Cookie). Si
              magic_quotes vale on, todas las ' (comilla sencilla), " (comilla doble), \ (barra
              invertida) y los NULL son automáticamente marcados con una barra invertida.
              Si además magic_quotes_sybase vale on, la comilla sencilla es marcada
              con otra comilla sencilla en lugar de la barra invertida.
•   magic_quotes_runtime boolean
        – Si se habilita magic_quotes_runtime, muchas de las funciones que devuelven
              datos de algún tipo de fuente externa incluyendo bases de datos y archivos de
              texto devolverán las comillas marcadas con una barra invertida. Si también
              está activo magic_quotes_sybase, la comilla simple es marcada con una
              comilla simple en lugar de la barra invertida.

                                                                                                  10
Administración PHP

Configuración: Directivas generales
•   max_execution_time integer

        – Fija el tiempo máximo en segundos que se le permite usar a un script antes
              de ser finalizado por el intérprete. Evita que scripts mal escritos puedan
              bloquear el servidor.

•   memory_limit integer

        – Fija el tamaño máximo de memoria en bytes que se permite reclamar a un
              script. Evita que script mal escritos utilizen toda la memoria disponible de
              un servidor.

•   short_open_tag boolean

        – Indica si se debe permitir el formato corto () de la etiqueta de apertura
             de PHP. Si desea utilizar PHP en combinación con XML, deberá
             desactivar esta opción. Si está desactivada, deberá utilizar el formato largo
             de la etiqueta de apertura ().

                                                                                             11
Administración PHP

Configuración: Directivas generales
•   upload_tmp_dir string

        – El directorio temporal utilizado para almacenar archivos cuando se envían al
             servidor. Debe tener permiso de escritura para el usuario bajo el que corra
             PHP.

•   user_dir string

        – El nombre base del directorio utilizado bajo el directorio inicial de un usuario
             para los archivos PHP. Por ejemplo: paginas_html.

•   warn_plus_overloading boolean

        – Si está activada, esta opción hace que PHP muestre un aviso cuando el
             operador suma (+) se utiliza en cadenas. Permite encontrar fácilmente
             scripts que necesitan ser reescritos utilizando el concatenador de cadenas
             (.).

                                                                                             12
Administración PHP

Configuración: Directivas de correo
•   SMTP string
        – Nombre DNS o dirección IP del servidor de SMTP que PHP bajo Windows
            deberá usar para enviar correos con la función mail().
•   sendmail_from string
        – La dirección del remitente ("De:") para los correos enviados desde PHP bajo
             Windows.
•   sendmail_path string
        – Localización del programa sendmail. Generalmente /usr/sbin/sendmail
             o /usr/lib/sendmail.
        – Los sistemas que no usan sendmail deberán fijar esta directiva al nombre del
             programa alternativo que ofrezca su sistema de correo. Por ejemplo, los
             usuarios de Qmail pueden fijarlo a /var/qmail/bin/sendmail

                                                                                         13
Administración PHP

Configuración: Directivas de modo seguro
•   safe_mode boolean

        – Para activar el modo seguro de PHP (muy poco recomendable).

•   safe_mode_exec_dir string

        – Si PHP se utiliza en modo seguro, la función system() y el resto de funciones
             que ejecutan programas del sistema se niegan a ejecutar programas que
             no estén en este directorio.

                                                                                          14
Administración PHP

Configuración: Directivas de MySQL
•   mysql.allow_persistent boolean
         – Permitir o no conexiones MySQL persistentes.
•   mysql.default_host string
         – El servidor por defecto para utilizar cuando se conecte al servidor de bases
              de datos si no se especifica otro distinto.
•   mysql.default_user string
         – El nombre de usuario por defecto para utilizar cuando se conecta al servidor
              de base de datos si no se especifica otro.
•   mysql.default_password string
         – La clave por defecto para utilizar cuando se conecta al servidor de base de
              datos si no se especifica otro.
•   mysql.max_persistent integer
         – El número máximo de conexiones persistentes de MySQL por proceso.
•   mysql.max_links integer
          – El número máximo de conexiones de MySQL por proceso, incluyendo las
               persistentes.

                                                                                          15
Administración PHP

Configuración: Directivas de PHP5
•   zend.ze1_compatibility_mode boolean
         – Habilita compatibilidad con Zend Engine 1 (PHP 4.x)
•   error_reporting string
         – E_STRICT: información en tiempo de ejecución, habilita sugerencias para
             cambiar el código. (deshabilitar en producción)
•   auto_globals_jit boolean
         – Cuando está habilitado, las variables SERVER y ENV se crean cuando son
             usadas por primera vez (Just In Time) y no cuando el script se inicia. Si
             estas variables no se usan en el script, se gana en rendimiento.
•   mail.force_extra_parameters string
         – Fuerza la adición del parámetro especificado en el binario sendmail.
•   register_long_arrays boolean
         – Registrar las variables "deprecated" predefinidas $HTTP_*_VARS.
•   session.hash_function integer
          – Algoritmo hash para generar el session ID.
          – 0 = MD5 (128 bits) / 1 = SHA-1 (160 bits).

                                                                                         16
Administración PHP

Configuración: Directivas de PHP5
•   mysqli.max_links
•   mysqli.default_port
•   mysqli.default_socket
•   mysqli.default_host
•   mysqli.default_user
•   mysqli.default_pw
•   mysqli.reconnect
        – Directivas para la libreria MySQL Improved (versión 4.1)
•   soap.wsdl_cache_enabled       boolean
        – Habilita o deshabilita el WSDL caching.
•   soap.wsdl_cache_dir string
        – Directorio dónde se almacenaran los archivos de caché de la extensión
             SOAP.
•   soap.wsdl_cache_ttl int
        – Número de segundos que los archivos de caché serán usados antes que los
            originales.

                                                                                    17
Administración PHP

Configuración desde Apache
• Cuando se utiliza PHP como módulo Apache, también puede cambiar
    los ajustes de configuración utilizando directivas en los archivos
    de configuración de Apache y en los .htaccess.
• Hay unas pocas directivas de Apache que le permiten cambiar los
    ajustes de configuración de PHP:
       – php_value nombre valor
               • Fija el valor de la variable especificada.
       – php_flag nombre on|off
               • Fija una opción de configuración de tipo Boolean.
       – php_admin_value nombre valor
               • Fija el valor de la variable especificada. Los ajustes de
                    configuración de tipo "Admin" sólo se pueden fijar desde los
                    archivos principales de configuración del Apache, y no desde
                    los .htaccess.
       – php_admin_flag nombre on|off
               • Fija una opción de configuración de tipo Boolean.

                                                                                   18
Administración PHP

Configuración: Directivas monitoraje
•   display_errors boolean

        – Determina si los errores se visualizan en pantalla como parte de la salida en
            HTML o no.

•   log_errors boolean

        – Si los mensajes de error de los script deben ser registrados o no en el registro del
              servidor.

•   track_errors boolean

        – Si está habilitada, el último mensaje de error estará siempre presente en la
             variable global $php_errormsg

                                                                                                 19
Administración PHP

Configuración: Directivas monitoraje
•   error_log string

        – Nombre del fichero para registrar los errores de un script. Si se utiliza el valor
            especial syslog, los errores se envían al registro de errores del sistema.
            En UNIX se refiere a syslog(3) y en Windows al registro de eventos.

•   error_reporting integer

        – Fija el nivel de informe de errores. El parámetro es un entero que representa
              un campo de bits. Sume los valores de los niveles de informe de error que
              desea.

                                           – (continua)

                                                                                               20
Administración PHP

Configuración: Directivas monitoraje
La directiva error_reporting especifica el tipo de errores notificados por PHP.

           Tipo de error                                                            Descripción
E_ALL                               Todos los errores y avisos
E_ERROR                             Errores fatales detectados en tiempo de ejecución
E_WARNING                           Advertencias (errores no fatales) detectados en tiempo de ejecución.
E_PARSE                             Errores de sintaxis detectados en tiempo de compilación.
                                    Avisos detectados en tiempo de ejecución (pueden deberse a errores involuntarios o a errores intencionados,
E_NOTICE                            por ejemplo, utilizar una variable no inicializada, pero utilizarla teniendo en cuenta que se inicializará
                                    automáticamente a una cadena vacía)
                                    Avisos detectados en tiempo de ejecución, al activarlos PHP sugiere cambios en el código para que una
E_STRICT
                                    mejor interoperabilidad y compatibilidad en el futuro.
E_CORE_ERROR                        Errores fatales detectados durante el arranque inicial de PHP.
E_CORE_WARNING                      Advertencias (errores no fatales) detectados durante el arranque inicial de PHP.
E_COMPILE_ERROR                     Erores fatales detectados en tiempo de compilación.
E_COMPILE_WARNING                   Advertencias (errores no fatales) detectados en tiempo de compilación.
E_USER_ERROR                        Mensajes de error generados por el usuario.
E_USER_WARNING                      Advertencias generadas por el usuario.
E_USER_NOTICE                       Avisos generados por el usuario.
Para detectar el mayor número posible de errores durante el desarrollo de las páginas PHP es conveniente que la directiva error_reporting tome el
valor E_ALL, aunque muchos servidores no suelen mostrar los avisos, ya que pueden deberse a errores intencionados.

error_reporting = E_ALL                        Se muestran todos los errores.
error_reporting = E_ALL & ~E_NOTICE            Se muestran todos los errores, menos los avisos.

                                                                                                                                                    21
Administración PHP

Configuración: Verificar
• Para obtener los detalles de la configuración crearemos el siguiente
    script:
                • 

                                        ...

                                                                         22
Administración PHP

Archivo php.ini ejemplo

                                        23
Administración PHP

Monitoraje: Tratamiento de errores

    •Error handling

      – Método por el cual el programador puede sobrescribir la función que
          interceptará y tratará los avisos y errores de programación.

      – Esta técnica permite:

              • Crear un registro de errores contra una base de datos.

              • Enviar un correo al administrador en caso de fallo grave.

              • ...

                                                                              24
Administración PHP

Monitoraje: Tratamiento de errores
Administración PHP

Monitoraje: Tratamiento de errores

       // se prepara el error
       $err = "\n";
       $err .= "\t".$dt."\n";
       $err .= "\t".$errno."\n";
       $err .= "\t".$errortype[$errno]."\n";
       $err .= "\t".$errmsg."\n";
       $err .= "\t".$filename."\n";
       $err .= "\t".$linenum."\n";
       $err .= "\n\n";

       // para testear
       // echo $err;

       // guardar en el log de errores
       error_log($err, 3, "/usr/local/php4/error.log");

       // si se trata de un error crítico se envía un correo al usuario
       if ($errno == E_USER_ERROR)
           mail("phpdev@example.com","Critical User Error",$err);
   }

                                                                          26
Administración PHP

Monitoraje: Tratamiento de errores
   function distance ($vect1, $vect2) {
       if (!is_array($vect1) || !is_array($vect2)) {
           trigger_error("Incorrect parameters, arrays expected", E_USER_ERROR);
           return NULL;
       }
       if (count($vect1) != count($vect2)) {
           trigger_error("Vectors need to be of the same size", E_USER_ERROR);
           return NULL;
       }
       for ($i=0; $i
Administración PHP

Monitoraje: Tratamiento de errores

   $old_error_handler = set_error_handler("userErrorHandler");

   // constante no definida, genera un aviso
   $t = I_AM_NOT_DEFINED;

   //   define algun “vector”
   $a   = array(2,3,"foo");
   $b   = array(5.5, 4.3, -1.6);
   $c   = array (1,-3);

   // genera un error de usuario
   $t1 = distance($c,$b)."\n";

   // genera otro error de usuario
   $t2 = distance($b,"i am not an array")."\n";

   // genera un aviso
   $t3 = distance($a,$b)."\n";

   ?>

                                                                 28
Administración PHP

Seguridad
●   Introducción
●   Variables globales
●   Nombres de ficheros
●   Subida de ficheros
●   Bibliotecas
●   Formularios

                                        29
Administración PHP

Seguridad: Introducción
  ●   Primera recomendación:
       ●   Disponer siempre de versiones actualizadas de Apache y PHP

  ●   Aspectos de PHP que pueden dar lugar a vulnerabilidades:
       ●   Variables globales
       ●   Nombres de ficheros
       ●   Subida de ficheros
       ●   Bibliotecas
       ●   Datos enviados desde formularios

                                                                        30
Administración PHP

Seguridad: Variables globales
     ●   Cuando register_globals está activado en el fichero php.ini,
          PHP crea automáticamente variables globales a partir de los
          datos de los formularios y de las cookies.

     ●   Esto puede dar lugar a problemas como en el ejemplo
          siguiente:

     •    

                                                                        31
Administración PHP

Seguridad: Variables globales
  ●
      Una llamada a este script de la forma:

             •pagina.php?superuser=1

             ■permitiría   obtener privilegios de superusuario

  ●   Para resolver este problema existen tres soluciones:

              • Deshabilitar register_globals en el fichero php.ini

              • Inicializar las variables

              • Establecer el orden de las variables en PHP

                                                                      32
Administración PHP

Seguridad: Variables globales
     ●   Deshabilitar register_globals en el fichero php.ini

             • La directiva register_globals del fichero php.ini establece si se
                admite o no la creación automática de variables globales.

             • A partir de PHP 4.2.0 el valor por defecto de esta directiva es off,
                que es el valor recomendable.

                                                                                      33
Administración PHP

Seguridad: Variables globales
    ●   Inicializar las variables:

             • El problema anterior se soluciona dando un valor inicial a la
                variable $superuser:

                 • 

                                                                               34
Administración PHP

Seguridad: Variables globales
   ●   Inicializar las variables:
        • Es recomendable inicializar todas las variables antes de usarlas. Se
            puede usar la directiva error_reporting=E_ALL en php.ini para que
            muestre un aviso cuando se use una variable que no haya sido
            previamente inicializada.

        • En un entorno de producción debe evitarse la aparición de mensajes
            de aviso o error. Para ello se utilizan las siguientes directivas en
            php.ini:
                 • display_errors = off

                 • log_errors = on

                 • error_log = /var/log/php_errors.log

        • Los errores irán al fichero especificado en lugar de mostrarse en la
            pantalla.

                                                                                   35
Administración PHP

Seguridad: Variables globales
   ●   Establecer el orden de las variables en PHP:

        • PHP crea automáticamente variables globales a partir del entorno
            (E), las cookies (C), la información del servidor (S) y los
            parámetros GET (G) y POST (P)

        • La directiva variables_order controla el orden de estas variables. El
            valor por defecto es “EGPCS”

        • Permitir la creación de variables globales desde parámetros GET y
            POST y desde cookies es potencialmente peligroso. Un posible
            valor para variables_order que evita esto es “ES”

        • En tal caso para acceder a los parámetros de los formularios y a las
            cookies se deben utilizar los arrays globales $_REQUEST,
            $_GET, $_POST y $_COOKIES

                                                                                  36
Administración PHP

Seguridad: Variables globales
  ●   Establecer el orden de las variables en PHP

       • Si se modifican las directivas register_globals y/o variables_order es
            preciso revisar los scripts existentes para adaptarlos a las nuevas
            circunstancias.

       • Una forma puede ser la siguiente:

                • $edad = $_REQUEST[‘edad’];

                • ...

                                                                                  37
Administración PHP

Seguridad: Nombres de ficheros
     ●   Es relativamente fácil construir un nombre de fichero que se
          refiera a algo distinto a lo que se pretende

     ●   Sea el siguiente código:

     •   include (“/usr/local/lib/bienvenida/$username”);

     ●   Este código pretende mostrar un mensaje de bienvenida
          personalizado para el usuario. Aparentemente no es
          peligroso, pero ¿qué ocurriría si el usuario introduce como
          nombre la cadena “../../../../etc/passwd”?

     • Se mostraría el fichero de passwords del sistema.

                                                                        38
Administración PHP

Seguridad: Nombres de ficheros
  ●   Además hay que tener en cuenta que las funciones de manejo de
       ficheros como include() o require() admiten nombres de ficheros
       remotos, lo que podría provocar la ejecución de código maligno
       cargado de otro servidor. Sea, por ejemplo, el código
            ●   include ($libdir . “/conecta.php”);
            ●

  ●   Si un atacante modifica el valor de la variable $libdir a, pongamos
       por caso, “http://atacante/”, y coloca en la raíz del mismo un
       fichero de nombre conecta.php, su código sería ejecutado

  ●   Se puede desactivar la funcionalidad de acceso a ficheros remotos
       con la siguiente directiva en php.ini:

        •   allow_url_fopen = off

                                                                            39
Administración PHP

Seguridad: Nombres de ficheros
   ●   Para chequear nombres de ficheros se utilizan las funciones
        realpath() y basename(). La primera convierte direcciones
        relativas en absolutas y la segunda toma una ruta y devuelve la
        parte correspondiente al nombre del fichero. Ejemplo:

        •   $file = $_POST[‘username’];

        •   $file2 = basename (realpath($file));

        •   if ($file2 != $file)

        •   die (“$file no es un username válido”);

        •   include (“/usr/local/lib/bienvenida/$file”);

                                                                          40
Administración PHP

Seguridad: Nombres de ficheros
  ●   Otra defensa contra los nombres de ficheros incorrectos es la
       directiva de php.ini open_basedir:

            ●   open_basedir = /alguna/ruta
            ●

  ●   PHP limitará las operaciones sobre ficheros al directorio
       especificado y sus subdirectorios:

        •   include (“/alguna/ruta/lib.inc”);        // permitido

        •   include (“/otra/ruta/lib.inc”);       // da error

                                                                      41
Administración PHP

Seguridad: Subida de ficheros
   ●   La subida de ficheros permite a un usuario enviar cualquier
        fichero al servidor, lo cual encierra un gran peligro ya que un
        atacante puede subir un código maligno y luego ejecutarlo,
        causando más daño que cuando se incluye el código desde un
        servidor remoto

   ●   Como recomendación general, debe evitarse utilizar el nombre
        enviado por el navegador (podría ser, por ejemplo, /etc/passwd).
        Es conveniente generar un nombre único para el fichero subido

                                                                           42
Administración PHP

Seguridad: Subida de ficheros
     ●   Otro peligro es el tamaño de los ficheros. Aunque se limite el
          tamaño máximo en el formulario, los ficheros se reciben
          automáticamente y luego se comprueba su tamaño.

     ●   Es posible que un usuario intente provocar un ataque de
          denegación de servicio enviando varios ficheros de gran
          tamaño a la vez y llenando el sistema de ficheros utilizado
          por PHP para almacenarlos.

     ●   Para evitar esto se puede utilizar la directiva post_max_size de
          php.ini. El valor por defecto suele ser más elevado de lo
          necesario.

                                                                            43
Administración PHP

Seguridad: Bibliotecas
     ●   Es conveniente almacenar los ficheros de biblioteca fuera de
          la raíz de la web para evitar que puedan ser accedidos por
          su URL.

     ●   En tal caso debe hacerse saber a PHP la ubicación de los
          ficheros indicando la ruta completa en los include() y
          require() o bien mediante la directiva include_path en
          php.ini

     •   include_path = “.:/usr/local/php:/usr/local/lib/myapp”

     ●   Esto es particularmente importante cuando en el código de la
          biblioteca aparecen passwords, como es el caso de las
          funciones de conexión con bases de datos
                                                                        44
Administración PHP

Seguridad: Formularios
     ●   Es recomendable validar todos los datos provenientes de
          formularios para asegurarse de que los valores recibidos son
          los esperados.

     ●   En general, cualquier información proveniente del exterior
          debe contemplarse como posiblemente contaminada y debe
          ser verificada antes de ser utilizada.

     ●   Sea el siguiente ejemplo:

     •   print (“Nombre: “ . $nombre);

     •   print (“Comentario: “ . $comentario);

                                                                         45
Administración PHP

Seguridad: Formularios
     ●   Si el autor del comentario introdujo algún código HTML en el
          texto del mismo, el código será interpretado y sus efectos
          podrían ser graves

     ●   Para evitar esto se puede utilizar la función
          htmlspecialchars(), que impide que se interpreten los
          caracteres especiales de HTML (, &)

     ●
         El código quedaría de la siguiente manera:

     •   print (“Nombre: “ . $nombre);

     •   print (“Comentario: “ . htmlspecialchars($comentario));

                                                                        46
Administración PHP

Seguridad: Resumen
  ●   De todo lo anterior podemos concluir las dos recomendaciones
       siguientes:

        ●   Configurar adecuadamente PHP a través del fichero php.ini
        ●   Seguir unas buenas prácticas en la programación.

  ●   Hay que tener en cuenta que cualquier cambio en la configuración
       de PHP afectará a los scripts de todos los usuarios y
       posiblemente a algunas herramientas, lo cual debe ser tenido en
       cuenta y estudiarse sus consecuencias antes de proceder a
       realizarlos.

                                                                         47
Administración PHP

Consideraciones al programador
   •Safe mode

   •Sessiones

   •Variables globales

   •phpinfo()

   •Tiempo de ejecución máximo

   •Máximo tamaño de UPLOAD
   •Permisos de upload
   •¿Porqué no se deben guardar archivos en la BBDD?

                                                       48
Administración PHP

Consideraciones al programador
   •Safe mode:
     – El Modo Seguro de PHP es un intento para resolver el problema de
          la seguridad en un servidor compartido.
     – Tratar de resolver este problema a nivel de PHP es
          arquitectónicamente incorrecto.
     – Ya que las alternativas en un servidor web y a niveles de sistemas
          operativos no son tan realistas puede ser una alternativa por
          ahora.
     – Restricciones:
             • Funciones restringidas (chdir, exec, system, passthru...)
             • PHP verifica si el dueño del script actual coincide con el dueño del
                  fichero a ser operado por una función de fichero.
             • Tiempo de ejecución limitado estrictamente.
             • Consultar manual: http://es.php.net/features.safe-mode
     – En resumen, no es demasiado recomendable utilizarlo.

                                                                                      49
Administración PHP

Consideraciones al programador
   •Sesiones:
     – Permiten almacenar datos al programador entre petición y petición.

     – ¿Dónde se almacenan?
             • Por defecto PHP está configurado para crear archivos temporales
                 en /tmp y uno por sessión.

             • En el caso de un servidor con gran carga y peticiones concurrentes:

                      – “Miles” de pequeños archivos de sessión en un sólo
                          directorio.

                      – Agotar el espacio en disco.

             • Se pueden configurar el almacenamiento de las sesiones contra
                 una BBDD (solo a nivel de programación).

                                                                                     50
Administración PHP

Consideraciones al programador
   •Variables globales:
     – Por razones de seguridad conviene desactivarlas.
     – Muchos programadores las usan de forma indiscriminada.

   •phpinfo():
     – Conviene que el programador conozca el uso de la función phpinfo()
         para conocer la configuración exacta del servidor.

   •Tiempo de ejecución máximo:
     – El programador debe tener en cuenta el tiempo máximo de ejecución
          configurado. Se puede alterar desde los scripts con la función
          set_time_limit().
     – Además se debe saber que Apache también dispone de la directiva
         timeout.

                                                                            51
Administración PHP

Consideraciones al programador
   •Máximo tamaño de UPLOAD:

     – Se configura con las directivas de PHP post_max_size y
         upload_max_filesize.

   •Permisos de upload:

     – ¿Se podrá escribir en el directorio deseado?

   •¿Porqué no se deben guardar archivos en la BBDD?

     – En la mayoría de bbdd las tablas se almacenan como archivos.

     – El sistema de ficheros puede no soportar archivos de más de 2Gb.

     – El rendimiento de la BBDD se ve perjudicado.

                                                                          52
Administración PHP

Recursos
   •Links recomendados:
     – Documentación oficial:
                    • http://www.php.net
                    •
   •Bibliografia recomendada:
     –
     –   Sams Teach Yourself PHP, MySQL® and Apache All in One
     –   By Julie C. Meloni
     –   Publisher: Sams Publishing
     –   Pub Date: December 18, 2003
     –   ISBN: 0-672-32620-5
     –   Pages: 624
     –
     –   PHP5 and MySQL Bible
     –   By Tim Converse, Joyce Park
     –   Publisher: Wiley Publishing, Inc.
     –   Pub Date: 2004
     –   ISBN: 0-7645-5746-7
     –   Pages: 1083
     –
     –   PHP Cookbook
     –   By David Sklar, Adam Trachtenberg
     –   Publisher: O'Reilly
     –   Pub Date: November 2002
     –   ISBN: 1-56592-681-1
     –   Pages: 632
     –

                                                                  53
También puede leer