Tutorial: Crear area restringida con php en nuestra web

Iniciado por Yeshua, 2 Octubre 2008, 02:21 AM

0 Miembros y 2 Visitantes están viendo este tema.

Yeshua

Crear  área restringida con php en nuestra web.

Hola, ¿Cómo están? Aquí les dejo una forma sencilla de crear un area de nuestra web restringida con usuario y password hacia una página personal de nuestro usuario. Este tuto lo hago despues de pasar lo mio para llegar a este fin, a si que espero que les sirva.

Antes de nada debo decir que para realizar una web en php es necesario tener algún interprete de éste para poder ejecutarlo.

Materiales a utilizar:
- bloc de notas
- interprete de php (en mi caso AppServ  con php5)

Archivos a utilizar:
-página de ingreso: (en nuestro ejemplo se llamará ingreso.php) ingreso.php
-página de control: (donde se verifica si el user y password están restringidos) control.php
-página privada: (area restringida personal para nuestro usuario) user1.php// user2.php// user3.php


 Para seguridad ingresaremos un par de códigos en las páginas que a continuación explicaré y tomaremos algunas precauciones más.


Es hora de comenzar, guardaremos este formulario de inscripción en un bloc de notas o lo insertaremos  en la página de inicio que nosotros queramos, ojo, siempre con la extensión .php (en este caso ingreso.php):

Código (php) [Seleccionar]

<html>
<head>
<title>Acceso Restringido</title>
</head>
<body>
<h1>Autentifíquese</h1>
<form action="control.php" method="POST">
<table align="center" width="225" cellspacing="2" cellpadding="2" border="0">
<tr>
<td colspan="2" align="center"
<?if ($_GET["errorusuario"]=="si"){?>
bgcolor=red><span style="color:ffffff"><b>Datos incorrectos</b></span>
<?}else{?>
bgcolor=#cccccc>Introduce tu clave de acceso
<?}?></td>
</tr>
<tr>
<td align="right">USER:</td>
<td><input type="Text" name="usuario" size="8" maxlength="50"></td>
</tr>
<tr>
<td align="right">PASSWD:</td>
<td><input type="password" name="contraseña" size="8" maxlength="50"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="Submit" value="ENTRAR"></td>
</tr>
</table>
</form>
</body>
</html>


Bien, ahora abrimos otro bloc de notas e insertaremos el siguiente código para validar los usuarios que estén registrados y mandarlos a su página privada.

Código (php) [Seleccionar]
<?
//vemos si el usuario y contraseña es váildo
if ($_POST["usuario"]=="user1" && $_POST["contraseña"]=="xxxx"){
    //usuario y contraseña válidos
    //defino una sesion y guardo datos
    session_start();
    $_SESSION["autentificado"]= "SI";
    header ("Location: user1.php");
}else {
    //si no existe le mando otra vez a la portada
    header("Location: ingreso.php?errorusuario=si");

if ($_POST["usuario"]=="user2" && $_POST["contraseña"]=="asdfg"){
    //usuario y contraseña válidos
    //defino una sesion y guardo datos
    session_start();
    $_SESSION["autentificado"]= "SI";
    header ("Location: user2.php");

}else {
    //si no existe le mando otra vez a la portada
    header("Location: ingreso.php?errorusuario=si");

if ($_POST["usuario"]=="user3" && $_POST["contraseña"]=="pepe69"){
    //usuario y contraseña válidos
    //defino una sesion y guardo datos
    session_start();
    $_SESSION["autentificado"]= "SI";
    header ("Location: user3.php");

}else {
    //si no existe le mando otra vez a la portada
    header("Location: ingreso.php?errorusuario=si");
}
}
}
?>


Pues bien, ya estamos finalizando. Abrimos otro bloc de notas, o bien seleccionamos la web que tengamos creada de nuestro  user1.php //  user2.php  //  user3.php e inserteremos el siguiente código:

Código (php) [Seleccionar]

<?php 
if(!($_SERVER["HTTP_REFERER"]==" ingreso.php")){ 
echo 
"No puedes entrar, debes registrarte"
exit(); 
}
?>

<html >
<head>
<META NAME = "ROBOTS" CONTENT = "NOARCHIVE">
<title>USER1</title>
</head>
<body>
Estas autentificado, este es tu espacio personal.
<a href="salida.php" target="_top">Salir de forma segura</a> 
</body>
</html>


<?php
if(!($_SERVER["HTTP_REFERER"]=="ingreso.php" )){
echo "No puedes entrar, debes registrarte";
exit();
}
?>

El código éste, el que se situa al inicio del todo de la web sirve para que nadie pueda acceder a la zona restringida sin poner en la pagina ingreso.php los datos.


Asegurense de no dejar espacio entre el  código de php y el <html>
Fijense en esta etiqueta: <META NAME = "ROBOTS" CONTENT = "NOARCHIVE">
Esto evita que la web sea registrada por los motores de búsqueda de tipo google.  Aumentando algo más la seguridad.
Con este propósito, y con el fin de que no puedan acceder a el sitio donde tengamos ubicadas las páginas privadas (o mejor dicho que se les complique más) es introducir un archivo index.html  en blanco en la carpeta que queramos ocultar.

Esto fue todo, creo que esto tiene suficiente seguridad (a no ser que vayamos a albergar cuentas de crédito o cosas así, jaja) como para poder proteger  un área (si estoy equivocado por favor díganmelo, no soy un experto pero creo que esto para mis necesidades me sobra). Claro que es mucho mejor con bases de datos, este será mi próximo objetivo.

Saludos y díganme si les gustó, si tiene algún error, si no les funciona(a mi me va perfecto), etc.

--permito su publicación otro sitio siempre que se cite la fuente o autor.

PD: Este tuto ha sido elaborado completamente por mi, los codigos los he cogido de algunas web´s que no cito porque ni recuerdo cuantas miré para hacer lo que era mi proposito, por lo que en gran medida tube que ingeniarmelas para sin saber casi nada de php adaptarlo a mi caso. No creo que esto viole nada contra la propiedad o derechos de autor, si es así. diganmelo.


Hadess_inf

Hola que tal. Resulta que hace poco que empece a ver esto de la seguridad en PHP, no soy un experto pero en fin. QUisiera preguntarte algo, con respecto a esto:

Por que creas esta variable si no veo que la uses en el bloque de codigo siguiente:

Código (php) [Seleccionar]
$_SESSION["autentificado"]= "SI";

Especificamente que es lo que hace esa linea de codigo.

Código (php) [Seleccionar]

if(!($_SERVER["HTTP_REFERER"]=="ingreso.php" )){


Gracias por tu tiempo y tu futura respuesta.
xD

Yeshua

Hola, yo he de decir que tampoco soy un experto y que estoy empezando con esto, para sacarlo fue casi mediante el modo de prueba y error jeje.

respecto a esto
Código (php) [Seleccionar]
$_SESSION["autentificado"]= "SI";

Tienes razón, no es necesaria, lo he probado y por supuesto, se puede prescindir de ella.

El otro código:
Código (php) [Seleccionar]
if(!($_SERVER["HTTP_REFERER"]=="ingreso.php" )){

Hace que sea necesario y obligatorio acceder desde ingreso.php a user1.php, sino es así aparece en la pagina lo que tenemos establecido, algo asi como, para acceder debe registrarse. Y si le das a ver código fuente, no aparecerá código, claro. Tan solo esta frase.

Saludos y no os preocupeis por cansinearme que así aprendemos todos:p


NaSaRiD15

Una pregunta, yo tmb estoy novato y me interesa esto, asi que bueno vamos a ver, la duda es esta :

if ($_POST["usuario"]=="user3" && $_POST["contraseña"]=="pepe69"){     //usuario y contraseña válidos     //defino una sesion y guardo datos     session_start();     $_SESSION["autentificado"]= "SI";     header ("Location: user3.php");  }else {     //si no existe le mando otra vez a la portada     header("Location: ingreso.php?errorusuario=si");

Para cada usuario que creas se necesita esto?, no tenes base de datos? donde registras a los nuevos usuarios?.. o lo haces asi, mediante script, cada usuario que queres agregar, lo haces de este modo?..

Saludos y gracias, si es asi, creo que una base de datos le daria mucha mas flexibilidad.

Gracias por todo.
Hay que tomarse un tiempo para comprender que solamente sos lo que sos, de ahi a todo lo que tu quieras ser, eso ya depende de vos...

Hadess_inf

#4
Hola ya que estamos hablando del tema. SUpongo que NaSaRiD15 menciono ese ejemplo puesto que solo fue eso "...un ejemplo..." Claro esta que el login se hace con el acceso a una base de datos y todo eso. Volviendo al tema, me parece interesante el script, puesto que como tú mencionas, hace necesario que para acceder a una pagina restringida tengas que pasar por una pagina oculta (php) con codigo capaz de reconocer si es el usuario correcto y/o tiene los permisos necesarios para esto.

Dime este codigo tiene alguna contraparte ¡?

NaSaRiD15

Buenas hadess_inf , en realidad creo que el no utiliza base de datos, al menos en ninguna parte del codigo vi que se conectara a la misma, crea los usuarios en el script mismo, me parece, en realidad no se bien, pero estoy casi convencido que si.

Espero alguien pueda responderme esto rapido porque me genero la duda, gracias por todo.
Hay que tomarse un tiempo para comprender que solamente sos lo que sos, de ahi a todo lo que tu quieras ser, eso ya depende de vos...

Hadess_inf

Bueno pues si, no se vio lo que mencionas puesto que yo creo que solo fue algo didactico, para establecer la conexion se haria en 2 paginas. Por ejemplo:

Pagina uno: index.html
Código (html4strict) [Seleccionar]
<html>
<body>
<form name='f1' method='post' action='verifica.php'>
usuario: <input type='text' name='t1' size='10'>
clave : <input type='password' name='t2' size='10'>
<input type='submit' value='ingreso'>
</form>
</body>
</html>


CLaro que antes has de haber creado conexion.php con la conexion (valga la redundancia)
Pagina dos: verifica.php
Código (php) [Seleccionar]
<?
include_once "conexion.php";
$usu = $_post['t1'];
$cla = $_post['t2'];
//aqui codigo para evitar el SQL INYECTION o como se escriba xD
$sql = "select * from usuario where idusuario='$usu' and clave='$cla'";
$res = mysql_query($sql);
if(mysql_num_rows($res)==1)
{
session_register();
$_session['ingreso']=true;
header("location:micuenta.php");
}
else
{header("location:index.html");}
?>


Seria algo asi creo: xD
Ahora segun el ejemplo para poder acceder a una pagina restringida seria algo asi:

Código (php) [Seleccionar]
if(!($_SERVER["HTTP_REFERER"]=="verifica.php" )){

Pero ahora que lo pienso bien esto tendria algunas complicaciones. Porque siempre tendria que pasar por verifica para poder acceder a esa cuenta, ahora quizas se pueda cambiar el verifica.php por un valida.php, esta nueva pagina valida.php podria validar si el usuario esta activo o no.

valida.php
Código (php) [Seleccionar]
<?
if(isset($_session['ingreso']))
{
header("location:micuenta.php");
}
?>


Que alquien me corriga si me equivoco en algo.
Saludos.

NaSaRiD15

Yo se que es a modo de enseñar, solo queria decir que el crear los usuarios en el mismo script no es an flexible ni bueno como crearlos en una base de datos mysql, por ejemplo. simplemente eso.

Saludos y gracias por tu code, ahora lo miro bien y cualquier cosa te digo.
Hay que tomarse un tiempo para comprender que solamente sos lo que sos, de ahi a todo lo que tu quieras ser, eso ya depende de vos...

WHK

#8
Hice un pequeño script bién básico para ver si es esto lo que necesitas.
Te puedes registrar y cuando ingresas con tu user y pass tienes un contenido personalizado.

Demo: http://lab.jccharry.com/seguridad_web_doc/web.php

Código (php) [Seleccionar]
<?php
/*
Codeado por WHK para NaSaRiD15
*/

/* Configuraciones del php --------------------------------- */
error_reporting(0); // Evita fuga de información
set_magic_quotes_runtime(0); // Evita las adiciones de slashses que aplica apache en las Request URI
/* ---------------------------------------------------------- */

/* Datos de la base de datos -------------------------------- */
$servidor_bd '127.0.0.1';
$basededatos 'nasarid';
$usuario_bd  'nasarid';
$pass_bd 'pass';
/* ---------------------------------------------------------- */

/* Conectamos a la base de datos ---------------------------- */
if(!$conectar_sql mysql_pconnect($servidor_bd$usuario_bd$pass_bd)){
 
$error_critico "No se puede conectar a la base de datos";
}else{
 if(!
mysql_select_db($basededatos,$conectar_sql)){
  
$error_critico "No existe la base de datos seleccionada";
 }
}
/* ---------------------------------------------------------- */

verifica_error_db($error_critico);
$registro verifica_registrar();
verifica_login();

/* ---------------------------------------------------------- */

/* Página principal ----------------------------------------- */
if(logueado()){
 if(!
contenido_usuario_logueado()){
  
contenido_error();
 }
 exit(
0);
}else{
 
contenido_general();
 exit(
0);
}
/* ---------------------------------------------------------- */


/* Funciones ================================================ */
function verifica_login(){
/* Verifica si fue enviado el formulario de logueo */
 
if($_POST['user_login'] and $_POST['pass_login']){
  
setcookie('user_login'base64_encode($_POST['user_login']));
  
setcookie('pass_login'md5($_POST['pass_login']));
  
header("Estado: Redireccionando para su validacion...");
  
header("location: http://".$_SERVER[HTTP_HOST].$_SERVER[PHP_SELF]);
  exit(
0);
 }
}

function 
verifica_error_db($error_critico){
 
/* Verifica errores de conexión  */
 
if($error_critico){
  
mysql_close(); // Cierra la conexión MySQL
  
echo "<html><b>Error: </b>$error_critico<br></html>"// Escribe el error
  
exit(1); // Escapa del script
 
}
}

function 
logueado(){
 if(
$_COOKIE['user_login'] and $_COOKIE['pass_login']){
  global 
$conectar_sql;
  
$sql "
   SELECT `pass` FROM `usuarios` 
   WHERE `user` 
   LIKE CONVERT(_utf8 '"
.mysql_real_escape_string($_COOKIE['user_login'])."' USING latin1) 
   COLLATE latin1_swedish_ci
   LIMIT 1;
  "
;
  if(!
$peticion mysql_query($sql,$conectar_sql)){
   return 
false;
  }else{
   
$columna mysql_fetch_row($peticion);
   
mysql_free_result($peticion);
   if(!
$columna[0]){
    return 
false;
   }
   if(
$_COOKIE['pass_login'] == $columna[0]){
    return 
true;
   }else{
    return 
false;
   }
  }
 }else{
  return 
false;
 }
}

function 
contenido_usuario_logueado(){
 global 
$conectar_sql;
 
$sql "
  SELECT `contenido` FROM `usuarios` 
  WHERE `user` 
  LIKE CONVERT(_utf8 '"
.mysql_real_escape_string($_COOKIE['user_login'])."' USING latin1) 
  COLLATE latin1_swedish_ci
  LIMIT 1;
 "
;
 if(!
$peticion mysql_query($sql,$conectar_sql)){
  return 
false;
 }else{
  
$columna mysql_fetch_row($peticion);
  
mysql_free_result($peticion);
  echo 
$columna[0];
  return 
true;
 }
}

function 
contenido_general(){
 global 
$registro;
 echo 
'<h1>Creado por WHK para NaSaRiD15</h1><br>
<h2>http://foro.elhacker.net/php/tutorial_crear_area_restringida_con_php_en_nuestra_web-t229893.0.html</h2>
  <br><br>
  <h3>Ingresar:</h3><br>
  <form method="post">
  <input type="text" name="user_login"> User<br>
  <input type="passwd" name="pass_login"> Pass<br>
  <input type="submit" value="Ingresar">
  </form>
  <br><br><h3>O registrarse:</h3><br>
  <form method="post">
  <input type="text" name="user_registrar"> User<br>
  <input type="passwd" name="pass_registrar"> Pass<br>
  <input type="submit" value="Registrarse">
  </form><br><br>
  '
.$registro.'
 '
;
}

function 
contenido_error(){
 echo 
'
  <b><i>Hubo un error al devolver su contenido personalizado.<br>
  Elimine sus cookies y buelva a intentarlo.</i></b>
 '
;
}

function 
verifica_registrar(){
 if(
$_POST['user_registrar'] and $_POST['pass_registrar']){
  global 
$conectar_sql;
  
$sql "
   SELECT `user` 
   FROM `usuarios` 
   WHERE `user` 
   LIKE CONVERT(_utf8 '"
.base64_encode($_POST['user_registrar'])."' USING latin1) 
   COLLATE latin1_swedish_ci
   LIMIT 1;
  "
;
  if(!
$peticion mysql_query($sql,$conectar_sql)){
   return 
false;
  }else{
   
$columna mysql_fetch_row($peticion);
   
mysql_free_result($peticion);
   if(
base64_encode($_POST['user_registrar']) == $columna[0]){
    return 
"El usuario ya existe";
   }else{
    
$sql "
     INSERT INTO `usuarios` (`user`, `pass`, `contenido`) 
     VALUES ('"
.
     
base64_encode($_POST['user_registrar'])."', '".
     
md5($_POST['pass_registrar'])."', '<b>Bienvenido ".
     
mysql_real_escape_string(htmlspecialchars($_POST['user_registrar'], ENT_QUOTES)).
     
"!</b><br>Contenido a espera de ser editado.');
    "
;
    if(
mysql_query($sql,$conectar_sql)){
     
setcookie('user_login'base64_encode($_POST['user_registrar']));
     
setcookie('pass_login'md5($_POST['pass_registrar']));
     
header("Estado: Redireccionando para su validacion...");
     
header("location: http://".$_SERVER[HTTP_HOST].$_SERVER[PHP_SELF]);
     exit(
0);
    }else{
     return 
false;
    }
   }
  }
 }
}
/* =========================================================== */
?>


Base de datos en MySQL:
Código (sql) [Seleccionar]
-- phpMyAdmin SQL Dump
-- version 2.11.9.1
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 01-10-2008 a las 22:21:43
-- Versión del servidor: 5.0.45
-- Versión de PHP: 5.2.6

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- Base de datos: `nasarid`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `usuarios`
--

CREATE TABLE IF NOT EXISTS `usuarios` (
  `user` text NOT NULL,
  `pass` text NOT NULL,
  `contenido` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Volcar la base de datos para la tabla `usuarios`
--

INSERT INTO `usuarios` (`user`, `pass`, `contenido`) VALUES
('d3c=', 'ad57484016654da87125db86f4227ea3', '<b>Bienvenido ww!</b><br>Contenido a espera de ser editado.'),
('dHR0dHQ=', '3bad6af0fa4b8b330d162e19938ee981', '<b>Bienvenido ttttt!</b><br>Contenido a espera de ser editado.');

NaSaRiD15

Wow, excelente, muchas gracias por el trabajo esto es exactamente lo que estaba buscando!!!

Saludos whk, un gusto tenerlo por aqui!!!!!!!
Hay que tomarse un tiempo para comprender que solamente sos lo que sos, de ahi a todo lo que tu quieras ser, eso ya depende de vos...