proteger pagina con contrase帽a

daneil
03 de Marzo del 2010
Hola, me gustaria proteger una pagina con contrase帽a. Las contrase帽as deben de ir en un mysql. Alguien sabe donde puedo encontrar un ejemplo?

hunterhost
03 de Marzo del 2010
1.- Un archivo HTML que contenga un formulario de ingreso, tal como el que hicimos en el tutorial anterior.

2.- Un archivo PHP que, recibidos los datos del formulario, se conectar谩 a la base de datos y corroborar谩 que los datos existan y que estos sean correctos.

3.- Y finalmente otro archivo PHP que redirigir谩 a los usuarios dependiendo del resultado de la consulta hecha en el n潞 2. Si est谩n bien los datos los llevar谩 a la p谩gina que queramos mostrar, y de lo contrario, mostrar谩 un mensaje de error y los llevar谩 de vuelta a la p谩gina del n潞 1.

1. tiene que hacer un formulario donde solicite usuario y contrase帽a
A continuaci贸n, definiremos una tabla en la base de datos la cual almacenar谩 los datos correspondientes a todos los usuarios autorizados a entrar a nuestra p谩gina. Para definir esta tabla e ingresar algunos datos de prueba, lo m谩s recomendable es usar un sistema que todos los servicios de hosting ofrecen y que tambi茅n es obtenido haciendo una instalaci贸n local (mediante el uso de alg煤n software como XAMPP), que es phpMyAdmin. Este programa nos permite trabajar directamente sobre la base de datos, dandonos entre otras funcionalidades, la posibilidad de mantener datos, agregar usuarios y ver la estructura actual de nuestra BD.

Brevemente puedo decir que phpMyAdmin trabaja de 2 formas sobre la base de datos: Una mediante el interfaz gr谩fico el cual ofrece un modo bastante amigable para la creaci贸n y mantenci贸n de las estructuras y los datos. El otro es mediante consultas SQL, el cual si tienen el conocimiento del lenguaje es recomendable utilizar.

2.- Una vez adentro de PHPMyAdmin, crearemos una base de datos con el nombre que Uds. quieran y luego una tabla llamada “usuario” y dentro de ella definiremos los siguientes campos:

Usuario => Varchar (10)

Clave => Varchar (10)

Nombre => Varchar (40)

Adem谩s definiremos como “clave primaria” de la tabla al campo “usuario”

.- Con nuestra tabla definida, procederemos a ingresar datos a la tabla, al igual que el paso anterior, esto se puede hacer mediante interfaz o por una consulta SQL. Ingresaremos estos datos:

Usuario => demo

Clave => demo

Nombre => Usuario de prueba

Para ingresar los datos mediante interfaz, debemos marcar la tabla y hacer click al bot贸n “Examinar” que esta justo al lado y luego arriba al que dice “Insertar”.

Bot贸n Insertar

Con esto tenemos un usuario ingresado en nuestra base de datos y podremos hacer uso de ese registro para probar nuestro sistema.

4.- A continuaci贸n construiremos la p谩gina en PHP que validar谩 los datos recogidos a trav茅s del formulario:

Para esto, crearemos una p谩gina PHP en Dreamweaver, la cual guardaremos como &#8220;ingreso.php&#8221; e insertaremos el siguiente c贸digo antes de la etiqueta <HTML>:

<?
session_start();

$_SESSION["user"]=$_POST['usuario'];
$_SESSION["pass"]=$_POST['clave'];
$_SESSION["falla"]=0;

?>

<meta http-equiv=&#8221;refresh&#8221; content=&#8221;3; url=ingreso2.php&#8221; />

La explicaci贸n del c贸digo es la siguiente:

<?: Marca el inicio de un c贸digo ejecutable PHP.

session_start();: Se inicia una sesi贸n para el usuario que est谩 ingresando a nuestra p谩gina.

$_SESSION["user"]=$_POST['usuario'];: Lo que hacemos aqu铆 es tomar el valor &#8220;usuario&#8221; enviado desde el formulario (lo recogemos en el vector $_POST, el cual almacena todos los valores enviados por URL desde un formulario) y se lo asigna al valor &#8220;user&#8221; en el vector $_SESSION, el cual se encarga de almacenar variables que podr谩n ser accedidas desde cualquier p谩gina mientras la sesi贸n exista o el usuario se mantenga en la p谩gina.

$_SESSION["pass"]=$_POST['clave'];: Lo mismo que el caso anterior pero con los valores correspondientes.

$_SESSION["falla"]=0;: Creamos una variable llamada &#8220;falla&#8221; dentro del vector de sesi贸n, la cual usaremos como bandera que marcar谩 cualquier error que se produzca durante el proceso de validaci贸n. Le asignamos un valor 0, pero en verdad podemos darle el valor que queramos, ya que la verificaci贸n final con esta variable la haremos mediante una comparaci贸n con su valor original.

?>: Cerramos el c贸digo ejecutable PHP

<meta http-equiv=&#8221;refresh&#8221; content=&#8221;3; url=ingreso2.php&#8221; />: Esta etiqueta lo que har谩 es redireccionar la p谩gina actual (&#8221;ingreso.php&#8221;) a la p谩gina &#8220;ingreso2.php&#8221; cuando transcurran 3 segundos. (El valor del parametro content, que pueden modificar seg煤n deseen).

5.- Continuando con el c贸digo que insertaremos en nuestra p谩gina &#8220;ingreso.php&#8221;, ahora pondremos esto luego de la etiqueta <BODY>:

(Las explicaciones del codigo van entremedio marcadas en negrita, cursiva y con un /* y */)


<?
$user=$_POST['usuario'];
$pass=$_POST['clave'];

/* Asignamos a las variables $user y $pass los valores &#8220;usuario&#8221; y &#8220;clave&#8221; recogidos de nuestro formulario de ingreso de la p谩gina HTML. */

if(empty($user))
{
echo &#8220;No ha ingresado un nombre de usuario. <br> Sera redirigido de vuelta.&#8221;;
$_SESSION["falla"]=1;
}

/* Utilizaremos la funci贸n empty de PHP mediante la cual preguntaremos si nuestra variable $user (la que contiene el valor de usuario del formulario) se encuentra vacia, lo que significar铆a que el usuario no ingreso nada en el campo. Si este fuera el caso, desplegar铆amos un mensaje en la p谩gina con &#8220;echo&#8221; y luego cambiariamos el valor de nuestra variable &#8220;falla&#8221; (la bandera definida en el vector de sesi贸n) a 1. En caso de que el usuario no este vac铆o, pasamos al else y revisamos lo dem谩s */


else
{
if(empty($pass))
{
echo &#8220;No ha ingresado una clave. <br> Sera redirigido de vuelta.&#8221;;
$_SESSION["falla"]=1;
}

/* Haremos la misma comprobaci贸n anterior pero en este caso con la variable $pass (que almacena el valor de clave del formulario). En caso de que no este vac铆a, pasamos al else */
else
{
$con=mysql_connect(&#8221;host&#8221;,&#8221;user&#8221;,&#8221;password&#8221;);

/* Declaramos una variable llamada $con a la que le almacenaremos el resultado de la funci贸n mysql_connect, la cual se encarga de establecer una conexi贸n entre nuestra p谩gina PHP y nuestra base de datos MySQL para poder realizar las consultas que necesitamos para validar los datos. Esta funci贸n utiliza 3 parametros y devuelve un resultado de tipo entero (int):

Host: La direcci贸n del servidor donde tenemos alojada nuestra base de datos. Com煤nmente este valor debiera ser localhost (en caso de que esta p谩gina la ejecutemos en el mismo servidor donde esta alojada la BD), si no, es un dato que su proveedor de hosting deber铆a darles.

User: El usuario con el que ingresan a la BD. Tambien otorgado por su proveedor de hosting.

Password: Contrase帽a para ingresar a la BD. Lo mismo que el caso anterior. */

mysql_select_db(&#8221;database&#8221;,$con);

/* Llamamos a la funci贸n mysql_select_db la cual nos ayudar谩 a seleccionar nuestra base de datos (la cual esta dentro de la base de datos) y que requiere de 2 parametros:

Database: Nombre de nuestra base de datos. (La que creamos al principio).

Identificador de conexi贸n: El cual le otorga los datos de conexi贸n a la funci贸n, en nuestro caso la variable $con. */


$sql=&#8221;SELECT usuario, clave, nombre FROM usuario WHERE usuario=&#8217;$user&#8217;&#8221;;

/* Definimos una variable $sql , la cual guardar谩 la consulta que haremos en la base de datos. En este caso, pediremos seleccionar el usuario, la clave y el nombre correspondientes al registro del usuario que se ingres贸 mediante el formulario */


$resultado=mysql_query($sql,$con);

/* Definimos una variable llamada $resultado en la cual almacenaremos, valga la redundancia, el resultado de la ejecuci贸n de nuestra consulta mediante la funci贸n mysql_query, la cual requiere de 2 parametros: la consulta recien definida, y el identificador de conexi贸n que definimos anteriormente. */


if(!$resultado)
{
$error=mysql_error();
print $error;
$_SESSION["falla"]=1;
exit();
}

/* Luego preguntamos mediante un if si no hubo resultado a la ejecuci贸n de la consulta y almacenamos en la variable $error la falla otorgada por la base de datos para presentarla en la p谩gina mediante la sentencia print (que es similar a &#8220;echo&#8221;) y cambiamos el valor de la variable &#8220;falla&#8221; de nuestro vector de sesi贸n. Finalmente hacemos uso de la funci贸n exit(); para que nuestro c贸digo termine de ejecutarse aqu铆 y no sigan corriendo las l铆neas siguientes. Este paso puede obviarse ya que a los usuarios no es necesario ense帽arles el error que nos da la base de datos, yo decid铆 incluirlo para que uds. puedan probar e informarse de las distintas razones por las que puede haber una falla en este proceso. */


if(mysql_affected_rows()==0)
{
echo &#8220;El usuario no fue encontrado. <br> Sera redirigido de vuelta.&#8221;;
$_SESSION["falla"]=1;
exit();
}

/* Luego mediante otro if , hacemos un llamado a la funci贸n mysql_affected_rows() la cual se encarga de notificar si es que la consulta no afecto a ninguna fila de nuestra tabla (o sea, no hubo coincidencias), esta funci贸n retorna un entero, que es 0 en caso de no haber filas afectadas. En caso de que as铆 sea desplegamos un mensaje informando que el usuario no fue encontrado mediante la sentencia &#8220;echo&#8221;, cambiamos el valor de la variable falla del vector de sesi贸n y finalmente salimos del c贸digo mediante la funci贸n exit();. Si el resultado de la funci贸n no es cero, significa que hubo coincidencias y pasamos al else */


else
{
$row=mysql_fetch_array($resultado);

/* Definimos una variable $row y a esta le asignamos el resultado de la funci贸n mysql_fetch_array, la que utiliza como parametro $resultado (el resultado de la consulta ejecutada). Este paso es necesario, ya que cuando hacemos una consulta sobre una tabla de una base de datos, en caso de haber coincidencia, estos datos no est谩n disponibles para que nosotros los podamos manipular, si no que se seleccionan de forma &#8220;virtual&#8221;. Normalmente las bases de datos definen cursores, los cuales al hacer un fetch, extraen los datos y nos permiten manipularlos de una forma m谩s &#8220;fisica&#8221; por decirlo de alguna forma. En este caso, la variable $row se transformar谩 en un vector, con posiciones de nombre igual a cada uno de los campos de la fila, los cuales podremos comparar. */


$nombre=$row['nombre'];

/* Definimos una variable $nombre y a este le asignamos el valor de la posici贸n &#8220;nombre&#8221; del vector $row, o sea, el campo nombre extra铆do de la coincidencia de la tabla usuario */

if($user==$row['usuario'])
{
if($pass==$row['clave'])
{
echo &#8220;<b>Bienvenido $nombre</b>. <br> Espere mientras es redirigido&#8221;;
$_SESSION["nombre"]=$nombre;

}
else
{
echo &#8220;Hay un error en la clave. <br> Espere mientras es redirigido&#8221;;
$_SESSION["falla"]=1;
}
}
else
{
echo &#8220;Hay un error en el nombre de usuario. <br> Espere mientras es redirigido&#8221;;

$_SESSION["falla"]=1;
}

/* Y Finalmente mediante una serie de if y else, comparamos los valores recibidos por el formulario (almacenados en las variables $user y $pass) con los extra铆dos de la fila de la tabla de la base de datos (almacenados en el vector $row). En caso de coincidir el nombre de usuario y la contrase帽a, desplegamos un mensaje dandole la bienvenida al usuario con una sentencia echo (al usar el mensaje con la variable $nombre, dejamos definido un mensaje que cambiar谩 dependiendo del nombre de cada usuario que entre) y le informaremos que ser谩 redirigido, para finalmente registrar en el vector de sesi贸n el nombre del usuario, en caso de que necesitemos usarlo m谩s adelante. De lo contrario mostraremos los correspondientes mensajes de error y marcaremos la variable falla para m谩s adelante. */
}
}
}

?>

6.- Creamos nuestra p谩gina PHP e insertamos el siguiente c贸digo antes de la etiqueta <HTML>:

La explicaci贸n del c贸digo entremedio, en negritas, cursiva y entre /* */:

<?
session_start();

/* Iniciamos sesi贸n dentro de esta p谩gina tambi茅n mediante la funci贸n session_start(); */

if($_SESSION["falla"]==0)
{

$_SESSION["autorizacion"]=&#8221;si&#8221;;

header(&#8221;Location: pagina-de-destino.php&#8221;);

}

/* Lo primero que hacemos es preguntar si la variable &#8220;falla&#8221; del vector de sesi贸n tiene valor igual a 0. Si esto es as铆 significa que paso todo el proceso de validaci贸n sin errores, ya que en la p谩gina anterior ante cualquier problema le asignamos otro valor. En caso de que sea as铆, hacemos una redirecci贸n por PHP mediante &#8220;header&#8221; y dentro de Location ponemos la p谩gina de destino donde llegaran los usuarios autorizados. Adem谩s definimos una variable llamada &#8220;autorizaci贸n&#8221; y le asignamos el valor &#8220;si&#8221;. Este variable nos permitir谩 hacer un manejo de sesiones en cualquiera de las p谩ginas que sigan preguntando simplemente si esta activado el valor si, y de esa forma mostrar el contenido autorizado */

else
{
unset($_SESSION["falla"]);

session_destroy();

header(&#8221;Location: pagina-de-formulario.html&#8221;);

}
?>

/* En caso de que no sea igual a cero el valor, significa que hubo un problema de validaci贸n y por lo tanto el usuario no esta autorizado. Por lo que borramos la variable falla del vector de sesi贸n mediante la funcion &#8220;unset&#8221;, y luego destruimos la sesi贸n del usuario mediante la funci贸n session_destroy();, para que as铆 ningun valor de la sesi贸n quede almacenado en caso de futuros ingresos. Finalmente redirigirmos mediante header a la p谩gina inicial de ingreso de formulario. */


7.- En nuestra p谩gina de destino (la que viene despu茅s del proceso de validaci贸n) solo necesitamos insertar el siguiente c贸digo despu茅s de la etiqueta <BODY>:

<?

if($_SESSION["autorizacion"]==&#8221;si&#8221;)

{

?>

y aqu铆 desplegamos el contenido para los usuarios autorizados. Una vez que terminemos de desplegar el contenido, al final de eso abrimos c贸digo nuevamente:

<?

}

else

{

echo &#8220;Usted no esta autorizado para ver este contenido. Por favor&#8221; ?> <a href=&#8221;pagina-de-formulario.html&#8221;><? echo &#8220;Identifiquese&#8221; ?></a>.

}

?>

Nota: En el caso del else, es necesario cerrar el codigo PHP antes de ingresar c贸digo HTML (como el <a href ), por eso cerramos y volvimos a abrir para seguir con el texto.

Como notas No es muy dificil solo esdarlte la idea y tener pasiencia XD.

pero si quier algo mas experto puede buscar en google : autentificaci贸n de usuario en PHP
y encotraras otros mas compplejos y mas completos ..
Espero te puede haber ayudado