Diferencia entre revisiones de «Usuario:ManuelRomero/php/autentificacion»
De WikiEducator
< Usuario:ManuelRomero | php
(Página creada con «{{TEP}} {{:Usuario:ManuelRomero/php/nav}} <!--__NOEDITSECTION__--> __NOTOC__ {|cellpadding="5" cellspacing="6" style="width:100%;background:#DFFFFF; border-style:solid;...») |
|||
| (21 revisiones intermedias por el mismo usuario no mostrado) | |||
| Línea 1: | Línea 1: | ||
| − | |||
| − | |||
| − | |||
{{:Usuario:ManuelRomero/php/nav}} | {{:Usuario:ManuelRomero/php/nav}} | ||
| Línea 12: | Línea 9: | ||
<span style="background:#FFFF99"> | <span style="background:#FFFF99"> | ||
</span> | </span> | ||
| − | [[Imagen:DWES_TituloTema5. | + | [[Imagen:DWES_TituloTema5.png|center]] |
| − | | | + | |
| + | |||
| + | ===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 | ||
| + | *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 contendio 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 coneseguimos 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 autentifiación. | ||
| + | *Seguramente ya lo habéis estudiado en despliegue, pero lo vamos a comentar | ||
| + | *El mecanismo es sencillo. | ||
| + | #Definir los usarios con acceso permitido | ||
| + | #Se puede indicar a qué recursos tiene acceso el usuario en concreto | ||
| + | #el código http en caso de acceso restringido es el 401 | ||
| + | #El navegador al recigir ese código solicita credenciales | ||
| + | *El servidor recibe estas credenciales y las almacena en sus variables superglobales para futuras solicituds | ||
| + | ;Crear la lista de usuarios | ||
| + | *Usamos la herramienta '''''htpasswd''''' para crear un fichero con los usarios y sus contraseñas | ||
| + | http://httpd.apache.org/docs/2.4/es/howto/auth.html | ||
| + | *Este comando tiene una serie de opciones que podemos ver en línea de comandos sin mas que esciribr su nombre | ||
| + | <source lang=bash> | ||
| + | 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. | ||
| + | </source> | ||
| + | *importante es la opción -c para crear el fichero | ||
| + | *Para incorporar nuevos usuarios se escribe sin opcion y se añaden | ||
| + | *Por seguridad es importante añadir el fichero en una ubicación fuera del servidor web. | ||
| + | |||
| + | {{Actividad| | ||
| + | crea un fichero llamado misUsuarios y añade 3 usuarios maria/maria nieves/nieves sara/sara | ||
| + | |||
| + | <source lang=bash> | ||
| + | sudo htpasswd -c misUsuarios maria | ||
| + | .... | ||
| + | sudo htpasswd nieves | ||
| + | .... | ||
| + | sudo htpasswd nieves | ||
| + | </source> | ||
| + | |||
}} | }} | ||
| + | ;Indicar los recursos restringidos al servidor apache, la mejor opción (no la única)es crear un directorio .htacess, en le directorio en el que se encuentren los recursos compartidos | ||
| + | *Para indicar los recursos restringidos usarmos las siguientes directivas ya conocidas | ||
| + | *'''''AuthName''''' Nombre de dominio de la authentificación | ||
| + | *'''''AuthType''''' Tipo de autentificación '''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 recuros | ||
| + | *Ademas en el fichero de confituración de apache debemos activar la directiva '''''AllowOverride''''' | ||
| + | http://httpd.apache.org/docs/2.4/es/mod/core.html#allowoverride | ||
| + | {{Actividad| | ||
| + | Crea un sencillo sitio web que me rediriga a 4 páginas: | ||
| + | *'''''Información General''''' : Tendrá acceso todo el mundo | ||
| + | *'''''Información restirngida''''': Sólo tendŕan acceso maría nieves y sara | ||
| + | *'''''Información Sara''''' : Tendrá acceso solo el usuario sara | ||
| + | *'''''Información de grupo''''' : Tendrá acceso los usuarios maría y nieves | ||
| + | }} | ||
| + | |||
| + | ====PHP accediendo a información http==== | ||
| + | *Desde el código de php podemos acceder a la información facilitada por el servidor php. | ||
| + | *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 | ||
| + | {{Actividad| | ||
| + | *Modifica la página restringida para ver el usuario y password así como el método usado de autentifiacion | ||
| + | *El código que habría que añadir | ||
| + | <source lang=php> | ||
| + | <?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']; | ||
| + | ?> | ||
| + | </source> | ||
| + | |||
| + | }} | ||
| + | |||
| + | ===Usar función header para la autentifiación=== | ||
| + | *La referencia de la función header | ||
| + | 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 | ||
| + | *Vamos a solicitar una autentificación de tipo basic | ||
| + | *Para ello especificamos la cabecera WWW-Authenticate | ||
| + | *Ademas de especificar el modo de autentifación ponemos el mensaje que verá el usuario | ||
| + | <source lang=php> | ||
| + | header('WWW-Authenticate: Basic Realm="Página de acceso restringido. Necesrias credenciales"'); | ||
| + | </source> | ||
| + | *Para no mostrar la página solicitada se envía un error 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 | ||
| + | <source lang=php> | ||
| + | header('HTTP/1.0 401 Unauthorized'); | ||
| + | </source> | ||
| + | *El código completo quedaría | ||
| + | <source lang=php> | ||
| + | <?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; | ||
| + | } | ||
| + | ?> | ||
| + | </source> | ||
| + | *Ahora debemos poder especificar cual va a ser el usuario esperado en esta página | ||
| + | *Por ejemplo en la página anterior insertamos un usario cualquiera y una password cualquiera entraremos ya que no comparamos con nadie | ||
| + | <source lang=php> | ||
| + | <?php | ||
| + | echo"Nombre de usuario: ".$_SERVER['PHP_AUTH_USER'] ."<br />"; | ||
| + | echo"Contraseña: ".$_SERVER['PHP_AUTH_PW'] ."<br />"; | ||
| + | ?> | ||
| + | </source> | ||
| + | ;Verficar el usuario y contraseñad | ||
| + | *Con el siguiente código verificaríamos el usuario y contraseña usando el modo de header | ||
| + | <source lang=php> | ||
| + | <?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; | ||
| + | } | ||
| + | ?> | ||
| + | </source> | ||
| + | *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 | ||
| + | *Podríamos crear la siguiente tabla en nuestra base de datos dwes | ||
| + | <source lang=sql> | ||
| + | |||
| + | -- Seleccionamos la base de datos | ||
| + | USE dwes; | ||
| + | -- Creamos la tabla | ||
| + | CREATE TABLE usuarios ( | ||
| + | usuario VARCHAR(20) NOT NULL PRIMARY KEY, | ||
| + | contrasena VARCHAR(32) NOT NULL | ||
| + | ) ENGINE = INNODB; | ||
| + | |||
| + | -- Creamos el usuario dwes | ||
| + | INSERT INTO usuarios (usuario, contrasena) VALUES | ||
| + | ('dwes', 'e8dc8ccd5e5f9e3a54f07350ce8a2d3d'); | ||
| + | </source> | ||
| + | *Con esto estaríamos creando el usuario '''''dwes''''' y su password '''''abc123.''''', el '''''punto final''''', también forma parte de la contraseña | ||
| + | *Si queremos usar una base de datos es importante cifrar el contenido de la password | ||
| + | *Para ello usaremos la función md5, cuya información oficial es | ||
| + | http://es.php.net/manual/es/function.md5.php | ||
| + | *Para usarla simplemente le haremos '''''md5(string)''''', y veremos el hash de dicho string | ||
| + | {{Actividad| | ||
| + | *Utilizando la extension mysqli, solicitamos credenciales para los usuarios en las diferentes páginas del ejercicio anterior, de modo que si bien el usuario o la pass son incorrecta, se vuelven a pedir credenciales. | ||
| + | *Para obtener el código md5 y crearlo en la base de datos, podemos usar esta página | ||
| + | http://www.md5online.es/cifrar-md5.html | ||
| + | ==Solución propuesta== | ||
| + | <source lang=php> | ||
| + | <!DOCTYPE html> | ||
| + | <?php | ||
| + | <!DOCTYPE html> | ||
| + | <?php | ||
| + | // Si el usuario aún no se ha autentificado, pedimos las credenciales | ||
| + | //Observa que escribimos esto antes de escribier ninguna salida | ||
| + | //Esto es importante si se usa la función header | ||
| + | if (!isset($_SERVER['PHP_AUTH_USER'])) { | ||
| + | header('WWW-Authenticate: Basic realm="Contenido restringido"'); | ||
| + | header("HTTP/1.0 401 Unauthorized"); | ||
| + | exit; | ||
| + | } | ||
| + | // Si ya ha enviado las credenciales, las comprobamos con la base de datos | ||
| + | else { | ||
| + | // Conectamos a la base de datos | ||
| + | |||
| + | $conexion = new mysqli("localhost", "root", "root", "dwes"); | ||
| + | $error = $conexion->connect_errno; | ||
| + | // Si se estableció la conexión | ||
| + | if ($error == null) { | ||
| + | //Realizamos una consulta preparada | ||
| + | $consulta = $conexion->stmt_init(); | ||
| + | // Ejecutamos la consulta para comprobar si existe | ||
| + | // esa combinación de usuario y contraseñ | ||
| + | $sql = <<<SQL | ||
| + | SELECT usuario FROM usuarios | ||
| + | WHERE usuario = ? AND | ||
| + | contrasena = ? | ||
| + | SQL; | ||
| + | |||
| + | $usuario = $_SERVER['PHP_AUTH_USER']; | ||
| + | $pass = md5($_SERVER['PHP_AUTH_PW']); | ||
| + | $consulta->prepare($sql); | ||
| + | $consulta->bind_param("ss", $usuario, $pass); | ||
| + | $consulta->execute(); | ||
| + | $consulta->store_result(); | ||
| + | if ($consulta->num_rows === 0) { | ||
| + | |||
| + | header('WWW-Authenticate: Basic realm="Contenido restringido"'); | ||
| + | header("HTTP/1.0 401 Unauthorized"); | ||
| + | //Esto solo se visualizará si damos a cancelar del formulario de autentificación | ||
| + | $consulta->close(); | ||
| + | $conexion->close(); | ||
| + | echo "<h1> Usuario y password no autorizado reintentelo </h1>"; | ||
| + | exit; | ||
| + | } | ||
| + | $consulta->close(); | ||
| + | $conexion->close(); | ||
| + | }//End error =null | ||
| + | }//End else de if !isset ..... | ||
| + | ?> | ||
| + | <html> | ||
| + | <head> | ||
| + | <meta http-equiv="content-type" content="text/html; charset=UTF-8"> | ||
| + | <title>Ejemplo Tema 4: Utilización de MySQL para autentificación HTTP</title> | ||
| + | <link href="dwes.css" rel="stylesheet" type="text/css"> | ||
| + | </head> | ||
| + | <body> | ||
| + | <?php | ||
| + | echo "Nombre de usuario: " . $_SERVER['PHP_AUTH_USER'] . "<br />"; | ||
| + | echo "Hash de la contraseña: " . md5($_SERVER['PHP_AUTH_PW']) . "<br />"; | ||
| + | ?> | ||
| + | </body> | ||
| + | </html> | ||
| + | </source> | ||
| + | }} | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |} | ||
Última revisión de 08:16 8 feb 2015
|

