seguridadSeguramente en lo primero que piense cualquiera que quiera proteger algún archivo en internet es ese complejo sistema de bases de datos, archivos encriptados etc etc.. pero Apache nos permite hacer esto de una forma mucho mas sencilla y mezclandolo con PHP la cosa se pone 100 veces mas fácil..

Cuando queramos poner contraseña a una de las carpetas del servidor para que solo se pueda ver las paginas que contiene si se sabe la contraseña podemos usar pass_protect() una sola vez, o reutilizarla para reescribir el usuario y/o contraseña.
Para hacer esto solo tenemos que introducir en el primer lugar un nombre de usuario (o varios en formad e array), en segundo lugar una contraseña (o varias) y por ultimo (opcionalmente) un texto que aparecerá cuando no se sepa la contraseña, (el texto de la tercera variable no puede contener comillas).

Y ahora una tanda de ejemplos:
Si el nombre de usuario y la contraseña no son array, se asignarán haciendo un par natural (nombre de usuario - contraseña).

PHP:
  1. $name = 'nombreusuario';
  2. $pass = 'SeCrEtO';
  3. pass_protect($name, $pass);

Si los valores de nombre y contraseña son array cada valor del array se emparejara haciendo un par (usuario-contraseña), con la excepción de que si uno de los dos no tiene suficientes valores, no se contaran como pares...

PHP:
  1. $name = array('nombre_1', 'nombre_2', 'nombre3');
  2. $pass = array('SeCrEtO_1', 'SeCrEtO2', 'SeCrEtO_3', 'contraseña_nula');
  3. pass_protect($name, $pass);

Si los valores de nombre son array y la contraseña no, se emparejaran todos los nombres de usuario con la misma contraseña.

PHP:
  1. $name = array('nombre_1', 'nombre_2', 'nombre3');
  2. $pass = 'SeCrEtO_unico';
  3. pass_protect($name, $pass);

Si los valores de contraseña son array y solo hay un nombre de usuario, se asignara el mismo nombre de usuario con varias contraseñas.

PHP:
  1. $name = 'nombredeusuario';
  2. $pass = array('SeCrEtO_1', 'SeCrEtO2', 'SeCrEtO_3');
  3. pass_protect($name, $pass);

Por ultimo un ejemplo simple con modificación del mensaje..

PHP:
  1. $name = 'nombredeusuario';
  2. $pass = 'SeCrEtO';
  3. $mensaje = 'No esta permitido entrar aquí sin autorización, pide una en juanito@algo.com'
  4. pass_protect($name, $pass);

y aquí os dejo la función:

PHP:
  1. function pass_protect($name, $pass, $msg='Area solo para usuarios registrados'){
  2.     $files['.htaccess'] = array(
  3.         'AuthName "'.$msg.'" ',
  4.         'AuthType Basic ',
  5.         'AuthUserFile '.realpath('./').'/.htpasswd ',
  6.         //'AuthGroupFile /dev/null ',
  7.         'require valid-user '
  8.     );
  9.     if(is_array($name) && is_array($pass)){ //si ambos son array
  10.         foreach($name as $k => $v){
  11.             if( !empty($name[$k]) && !empty($pass[$k]) ){   $files['.htpasswd'][] = $name[$k].':'.crypt($pass[$k]);    }
  12.         }
  13.     } elseif(is_array($name)){  foreach($name as $k => $v){   $files['.htpasswd'][] = $v.':'.crypt($pass);   }  //si el nombre es una array
  14.     } elseif(is_array($pass)){  foreach($pass as $k => $v){   $files['.htpasswd'][] = $name.':'.crypt($v);   }  //si el pass es un array
  15.     } else {                $files['.htpasswd'][] = $name.':'.crypt($pass)//si nunguno es un array
  16.     }
  17.    
  18.     foreach($files as $filename => $cont){
  19.         $cont   = implode("\n", $cont);
  20.         $fp  = fopen($filename, 'w+');
  21.         $read   = fwrite($fp, $cont, strlen($cont));
  22.         fclose($fp);
  23.     }
  24.     return true;
  25. }

que la disfrutéis..