Plantilla:PHP/Autentificacion
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
Contenido
Qué es autentificarse
- Por autentificarse vamos a entender un mecanismo por el cual el servidor web puede estar relativamente confiado en que está siendo consultado por una determinada máquina y/o persona
- Por ejemplo podemos visitar esta página y ver diferentes modos en los que piden autentificarse
https://www.tractis.com/login
- Modos de autentificarse
- contraseña y usuario
- Dni digital
- Certificados digitales de usuario
...
- Nosotros en este tema usaremos el módo de contraseña y usuario. En dos temas posteriores, cuando veamos servicios web usaremos otro sistema como google, igualmente se podría usar la cuenta de facebook o twiter para identificarte.
- La responsabilidad de exigir una clave de acceso puede recaer sobre el servidor web con los módulos de seguridad
- En este caso restringimos el acceso a la página o sitio web
- Otra opción habitual es tener un sitio con cierto contendo y en el sitio dar la posibilidad de identificarse / registrarse.
- A usuarios identificados se les ofrece otro contendio diferente.
Respecto a estos conceptos vamos a trabajar este tema que es el primero de tres aspectos del tema 4
Protocolo http vs https
- Este es un concepto importante, diferenciar en contenidos que se envíen de forma segura (usar cifrado en el envío que es lo que se hace con https) y en el hecho que para acceder a un sitio tengan un nivel de seguridad que implique que de alguna manera te tengas que autentificar.
- La seguridad del envío de datos es otro aspecto diferente del tema de la autentificación
- En seguridad entre otros aspectos tenemos
- La autentificación mecanismos por los cuales podemos confiar en que quien se ha identificado es conocido para el sistema.
- La confidencialidad son mecanismos con los que podemos confiar en que nadie puede ver el contenidio de la información ni modificarla durante la transmisión.
- Ambos mecanismos debería de trabajar conjuntamente. Por ejemplo si yo envío una contraseña para identificarse, pero con un sniffer, alguien la puede capturar y ver en claro, no conseguimos nada de seguridad .
- Para la transmisión segura se emplea el protocolo https.
- Este tema se estudia en el módulo de despliegue de aplicaciones web.
- Nosotros usaremos http sin cifrar, pero se insiste en que no es segura la transmisión, pues podría ser objetivo de espía informático.
Autentificación por el servidor web
- Es el propio servidor http quien nos ofrece este método de autentificación.
- Este tema se ve dentro del módulo de despliegue de aplicaciones web, no obstante aquí nos va a interesar, cómo podemos hacer que sea el servidor el que solicite las credenciales y recoja los datos aportados, y cómo desde php podemos ver esos valores o datos y gestionarlos en nuestro programa.
- Recordamos el mecanismo de autentificación que usa apache.
- Definir los usuarios con acceso permitido
- Se puede indicar a qué recursos tiene acceso el usuario en concreto (me refiero a qué páginas).
- Generar en cabecera http un código http 401 que es un código de acceso restringido. Este código hace que el usuario reciba un formulario para aportar sus credendiales
- El navegador al recibir ese código solicitando credenciales
- El servidor recibe estas credenciales y las almacena en sus variables superglobales para futuras solicitudes
Archivo:AutentificacionServidor.php
Crear la lista de usuarios
- Usamos la herramienta htpasswd para crear un fichero con los usuarios y sus contraseñas
http://httpd.apache.org/docs/2.4/es/howto/auth.html
- En caso de no tener la herramienta instalada debemos hacer la instalación de las herramientas o utilidades de apache escribiendo
sudo apt-get install apache2-utils
- Este comando tiene una serie de opciones que podemos ver en línea de comandos sin mas que escribir su nombre.
Usage: htpasswd [-cmdpsD] passwordfile username htpasswd -b[cmdpsD] passwordfile username password htpasswd -n[mdps] username htpasswd -nb[mdps] username password -c Create a new file. -n Don\'t update file; display results on stdout. -m Force MD5 encryption of the password (default). -d Force CRYPT encryption of the password. -p Do not encrypt the password (plaintext). -s Force SHA encryption of the password. -b Use the password from the command line rather than prompting for it. -D Delete the specified user. On other systems than Windows, NetWare and TPF the '-p' flag will probably not work. The SHA algorithm does not use a salt and is less secure than the MD5 algorithm.
- Es importante la opción -c para crear el fichero. Recuerda usarla sólo la primera vez; cuando la usas se crea el fichero, y si ya existiera se elimina el contenido del fichero y se crea de nuevo.
- Para incorporar nuevos usuarios se escribe sin opción y se añade el nombre de los usuario
- Por seguridad es importante añadir el fichero en una ubicación fuera del directorio documentRoot del servidor web.
1.- Primero nos ubicamos en el directorio donde queramos añadir o crear el fichero cd /home/MiUsuario MiUsuario es vuestro propio directorio 2.-Ahora creamos un directorio para guardar esta información y nos movemos en él mkdir usuarios cd usuarios 3.-Una vez correctamente ubicados generamos el fichero de las password con la herramienta htpasswd La primera vez con opción -c para crear el fichero htpasswd -c misUsuarios maria htpasswd misUsuarios nieves htpasswd misUsuarios nieves
|
- Indicar los recursos restringidos
- .htacces
- Para este cometido, apache nos permite usar el famoso fichero .htaccess que a continuación vamos a explicar.
- Para habilitar el uso de este fichero debemos indicarle al servidor web que vamos a utilizarlo. Esto se especifica en la directiva AllowOverride
- Para más información ver
http://www.bdat.net/documentos/apache/x367.html
Y la oficial (siempre la mejor).
http://httpd.apache.org/docs/2.4/es/mod/core.html#allowoverride
- En nuestro caso tenemos que poner el valor AuthConfig o bien All
- Una vez que hemos hecho esto, cada vez que vaya a coger un fichero de un determinado directorio, antes de entregarlo, verificará que si existe un fichero .htaccess en ese directorio, en cuyo caso pedirá credenciales.
- Para indicar los recursos restringidos usaremos las siguientes directivas (Este será el contenido del fichero .htaccess
- AuthName Nombre de dominio de la authentificación
- AuthType Tipo de autentificación, pudiendo ser Basic y más segura Dijest
- AuthUserFile Ruta del fichero de los usuarios con permiso
- Require valid-user o usuarios concretos de la lista que sí que tendrán acceso al recursos si se acreditan correctamente.
{{{1}}}
|
PHP accediendo a información http
- Ahora viene la parte que realmente nos interesa a nosotros/as, qué es usar esto dentro de nuestro código php.
- Desde el código de php podemos acceder a la información facilitada por el servidor.
- La matriz asociativa variable superglobal $_SERVER contiene esta información
- Concretamente los índices
- PHP_AUTH_USER Es el nombre del usuario
- PHP_AUTH_PW Es la password del usuario
- AUTH_TYPE Es el tipo de seguridad utilizado
<?php echo "te has autentificado como:<br/>"; echo "Usuario: ". $_SERVER['PHP_AUTH_USER']."<br/>"; echo "Password: ". $_SERVER['PHP_AUTH_PW']."<br/>"; echo "Tipo de autentificacion: ". $_SERVER['AUTH_TYPE']; ?>
|
Usar función header para la autentifiación
La referencia de la función header Sirve para crear cabeceras de la página solicitada
http://es.php.net/manual/es/function.header.php
Vamos a usarla para unas acciones concretas.
- Modificar el texto de error
En este caso no vamos a usar el fichero .htaccess. Cuando accedemos a una página y no nos hemos identificado aparece un error 401. Nosotros vamos a solicitar una autentifiación tipo basic. < br/> Para ello especificamos la cabecera WWW-Authenticate.Ademas de especificar el modo de autentifación ponemos el mensaje que verá el usuario:
header('WWW-Authenticate: Basic Realm="Página de acceso restringido. Necesitas credenciales"');
Para no mostrar la página solicitada se envía un código 401, lo que provoca que se solicite un usuario y contraseña antes de visualizar el resto de la página. El códgio quedaría:
header('HTTP/1.0 401 Unauthorized');
El código completo quedaría:
<?php if (!isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic Realm="Contenido restringido"'); header('HTTP/1.0 401 Unauthorized'); echo "Usuario no reconocido!"; exit; } ?>
Ahora debemos poder especificar cuál va a ser el usuario esperado en esta página. Por ejemplo en la página anterior insertamos un usuario cualquiera y una password cualquiera entraremos ya que no comparamos con ningún valor.
<?php echo"Nombre de usuario: ".$_SERVER['PHP_AUTH_USER'] ."<br />"; echo"Contraseña: ".$_SERVER['PHP_AUTH_PW'] ."<br />"; ?>
- Verficar el usuario y contraseña
Con el siguiente código verificaríamos el usuario y contraseña usando el modo de header
<?php if ($_SERVER['PHP_AUTH_USER']!='manolo' || $_SERVER['PHP_AUTH_PW']!='passManolo.') { header('WWW-Authenticate: Basic Realm="Contenido restringido"'); header('HTTP/1.0 401 Unauthorized'); echo "Usuario no reconocido!"; exit; } ?>
Esto nos podría servir, puesto que el código no se envía al cliente, y él nunca podría ver la password, ni el usuario. No obstante, siempre será una opción más segura, y más versátil tener el usuario almacenado en una base de datos que ya veremos más adelante cuando veamos bases de datos.
Haz un programa en el que controlemos que el usuario con tu nombre y la misma password pueda acceder Solo se dejarán 3 intentos si al tercer intento no lo consigue se le anulará la posibilidad de seguir intentándolo Tip: En seguida veremos las variables de sesión, pero aún hay que recurrir a los campos ocultos, que muchas veces serán muy útiles :)
|