Desarrollo de aplicaciones web con PHP y MySQL

Interactuando con el servidor

Sergio Sáez y José Luis Poza

E.T.S. de Ingeniería Informática

Introducción

En las aplicaciones en las que se quiere que el usuario sea capaz de actualizar los contenidos del servidor se requiere:

Subiendo ficheros al servidor en PHP

Subir el fichero:
<form enctype="multipart/form-data" action="upload.php" method="post">
  <input type="hidden" name="MAX_FILE_SIZE" value="1024">
  Subir el fichero: <input type="file" name="fichero"><br>
  <input type="submit" value="Enviar fichero">
</form>

Subiendo ficheros al servidor en PHP (cont.)

Acceso al fichero desde PHP

Acceso al fichero desde PHP (cont.)

<?php
$uploaddir 
'/var/www/uploads/';
if (!
is_uploaded_file($_FILES['fichero']['tmp_name'])) {
    echo 
"El fichero no se ha enviado correctamente. <br>\n";

} elseif (
$_FILES['fichero']['size'] <= ||
          
$_FILES['fichero']['size'] > MAX_SIZE) {
    echo 
"El fichero es demasido grande o está vacio. <br>\n";

} elseif (
$_FILES['fichero']['type'] != "text/plain") {
    echo 
"El fichero no es del tipo solicitado. <br>\n";

} elseif (
move_uploaded_file($_FILES['fichero']['tmp_name'],
                        
$uploaddir $_FILES['fichero']['name'])) {
    echo 
"El fichero se ha recibido correctamente. <br>\n";
} else {
    echo 
"Error al mover el fichero. Error: " .
         
$_FILES['fichero']['error']. ". <br>\n";
}
?>

Ficheros de configuración asociados

/etc/mime.types
Contiene la descripción de los tipos de archivo MIME y las posibles extensiones. Se puede encontrar en http://www.iana.org/assignments/media-types/. Ejemplos:
application/pdf                                 pdf
application/postscript                          ps ai eps
image/png                                       png
image/jpeg                                      jpeg jpg jpe
/etc/php5/apache2/php.ini
Contiene información sobre las caracteríticas del proceso de subida de ficheros en PHP.
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
; Whether to allow HTTP file uploads.
file_uploads = On
; Temporary directory for HTTP uploaded files (will use system default if not
; specified).
;upload_tmp_dir =
; Maximum allowed size for uploaded files.
upload_max_filesize = 2M

Accediento al sistema de ficheros

Una vez se ha recibido el fichero desde el usuario y se ha almacenado en un directorio quizás se necesite:

Vamos a ver un conjunto de funciones que nos van a permitir llevar a cabo estas acciones.

Examinando directorios

<?php resource opendir (string path); ?>
<?php string readdir (resource dir_handle); ?>
<?php void closedir (resource dir_handle); ?>
<?php void rewinddir (resource dir_handle); ?>

Examinando directorios (cont.)

$ ls -la
total 24
drwxr-xr-x  2 ssaez ssaez  4096 mar  4 18:39 .
drwxr-xr-x 14 ssaez ssaez  4096 mar  4 17:35 ..
-rw-r--r--  1 ssaez ssaez     0 feb 19 10:26 0
-rw-r--r--  1 ssaez ssaez 10995 feb 19 10:26 10-accediendo-al-servidor.fmt
-rw-r--r--  1 ssaez ssaez     0 feb 19 10:26 index.html
-rw-r--r--  1 ssaez ssaez   116 feb 19 10:26 Makefile
<?php
if ($handle opendir('.')) {
  echo 
"\n **** Primera pasada ****\n";
  
/* De esta forma no habrá problemas
     con los nombres de los ficheros (v.g. 0). */
  
while (false !== ($file readdir($handle))) {
      echo 
"$file\n";
  } 
// endwhile
  
echo "\n **** Segunda pasada ****\n";
  
/* Éste podría terminar antes del final. */
  
rewind($handle);
  while (
$file readdir($handle)) {
      echo 
"$file\n";
  }
  
closedir($handle);
}
?>
 **** Primera pasada ****
index.html
0
Makefile
.
10-accediendo-al-servidor.fmt
..

 **** Segunda pasada ****
index.html

Información sobre el directorio

<?php string dirname (string path); ?>
  • Recibe una ruta y devuelve el nombre del directorio.
<?php string basename (string path [, string suffix]); ?>
  • Recibe una ruta a un fichero y devuelve el nombre del fichero propiamente dicho.
<?php string realpath (string path); ?>
  • Recibe una ruta con enlaces simbólicos, y elementos del tipo "/./" o "/../" y devuelve la ruta canónica (absoluta) equivalente.
<?php float disk_free_space (string directory); ?>
  • Devuelve el espacio libre en bytes del sistema de ficheros o partición de disco en que se encuentra el directorio.
<?php float disk_total_space (string directory); ?>
  • Devuelve el espacio ocupado en bytes por el sistema de ficheros o partición de disco en que se encuentra el directorio.

Creando y borrando directorios

<?php bool rmdir (string dirname); ?>
<?php bool mkdir (string pathname [, int mode]); ?>
<?php int umask ([int mask]); ?>

Existen multitud de funciones que permiten obtener información sobre un fichero: si es un fichero, un directorio, un enlace, si es ejecutable, si se puede mofificar, etc.

Ejecución de programas

<?php string exec (string command [, array output
                
[, int return_var]]); ?>
<?php string system (string command [, int return_var]); ?>
<?php void passthru (string command [, int return_var]); ?>

Control de acceso con apache


ErrorDocument 401 /home/ssaez/php/include/error_401.php
AuthUserFile /home/ssaez/php/user.passwd
AuthGroupFile /home/ssaez/php/group.passwd
AuthName "Curso de PHP y MySQL"
AuthType Basic
require valid-user

Control de acceso con apache (cont.)

ErrorDocument error_code URL
Indica qué página debe mostrarse en caso de error. 401 es acceso denegado.
AuthUserFile file y AuthGroupFile file
Le indica a Apache dónde encontrar las claves de acceso para usuarios y los nombres de los grupos.

Este fichero se puede crear y actualizar con la orden htpasswd.

AuthName "name"
Nombre de la zona restringida. Se le muestra al usuario para indicarle qué clave se le está solicitando.
AuthType Basic
Indica que vamos a utilizar el mecanismo básico de autentificación. No hay otro implementado ;-)
require who_is_authorized
Indica a quién se le autoriza a acceder: usuarios y grupos concretos o cualquiera que sea un usuario válido.

Información de seguridad

PHP_AUTH_USER o REMOTE_USER
Contiene el usuario que se ha autentificado.
PHP_AUTH_PW
Contiene la clave con la que se ha autentificado sin cifrar.
HTTP_REFERER
Contiene la página desde la que hemos llegado a la página actual. Se puede utilizar para eliminar los accesos directos desde el exterior.