2010-08-09 137 views
6

Soy nuevo en la programación web y estoy tratando de encontrar algunos buenos ejemplos/tutoriales sobre cómo hacer un trabajo decente de crear un sitio web que requiere que los usuarios inicien sesión para ver las páginas más allá del registro principal en pagina.php contraseña protegida sitio web

Hasta ahora he encontrado 1 o 2 que he intentado, pero sigo corriendo el mismo problema. Si solo ingreso la URL de la página que quiero ver manualmente, puedo ingresar como si no hubiera nada allí.

+0

este es el ive tutoral estado siguiendo hasta ahora y no creo que su trabajo http://www.phpeasystep.com/phptu/6.html – Crash893

+0

Tal vez leí mal la pregunta, ¿necesita un sistema de inicio de sesión de usuario completo (por ejemplo, los diferentes usuarios necesitan ver cosas diferentes) o simplemente no desea que todos puedan ver su sitio? En mi opinión, .htaccess es el camino a seguir. – williamg

+0

Me gustaría llegar al punto en el que puedo tener usuarios y administradores y usuarios avanzados – Crash893

Respuesta

0

No es el uso de PHP para la autenticación, pero se puede usar .htaccess para proporcionar autenticación y posiblemente gestionar el archivo .htpasswd usando PHP:

http://www.freewebmasterhelp.com/tutorials/htaccess/

+1

quiere configuración de PHP, no de Apache, no se sale del tema –

+0

Dijo que era nuevo en la programación web y que estaba buscando una forma de crear un sitio web que requiera que los usuarios inicien sesión para ver las páginas más allá de las principales. página de inicio de sesión. .htaccess es una forma de hacer esto que quizás no haya pensado. Él nunca dijo que la solución tenía que estar en PHP. –

+0

Todavía quiero hacer php, pero esto me ayudará con un proyecto diferente, así que +1 para la idea de todos modos (no sé quién-1ed) – Crash893

1

Los sitios que usted ha mencionado es probable Anulable porque las páginas más allá del control de seguridad no ahorran y para verificar si el estado de conexión en cada página. Debe verificar que un visitante haya iniciado sesión antes de acceder a una página.

1

Creo que la mayoría de los usuarios esperarían la entrada de formulario para iniciar sesión. Si desea que el usuario vuelva e inicie sesión con la misma cuenta más adelante después de que expire su sesión, necesitará una base de datos para almacenar la información del usuario.

Al almacenar información del usuario en una base de datos, probablemente tampoco deba almacenar su contraseña. Por ejemplo: contraseña

name password       ... 
----------------------------------------------- 
Johnny '3858f62230ac3c915f300c664312c63f' 
Alice '80338e79d2ca9b9c090ebaaa2ef293c7' 
. 
. 
. 

de Johnny es en realidad "foobar", pero las tiendas de bases de datos md5('foobar'). Cuando Johnny intenta ingresar, ingresa su nombre de usuario ('Johnny') y su contraseña ('foobar'). En PHP, hash de la contraseña que entró, y llame a su valor de la contraseña de la base de datos, lo que resulta en:

if (md5('foobar') == '3858f62230ac3c915f300c664312c63f') 

Este condicional es true. Puede confirmar si inició sesión correctamente, pero nunca está almacenando su contraseña real.

La contraseña de Alice es 'foobaz'. Ella intenta ingresar, pero accidentalmente ingresa 'foobar', la contraseña de Johnny. esto resulta en:

if(md5('foobar') == '80338e79d2ca9b9c090ebaaa2ef293c7') 

Cuál es false. De nuevo, no sabe cuál es la contraseña de Alicia , solo que ingresó la incorrecta.

La desventaja de esta estrategia, por supuesto, es que no se puede decir al usuario cuál es su contraseña cuando la olvida, ¡no lo sabe! Puede resolver esto permitiendo que un usuario restablezca su contraseña (a una cadena semialeatoria) en lugar de limitarse a decirles cuál es su contraseña.

+1

Tenga en cuenta que este método sería la mejor manera de hacerlo si tuviera que almacenar piezas de información individuales para cada usuario. Si solo necesita que ciertas personas vean partes, o un sitio web completo, esto puede ser excesivo. – williamg

2

Al iniciar sesión utilizando un formulario, debe verificar el nombre de usuario y la contraseña en la base de datos. La contraseña debe codificarse (generalmente se hace usando el algoritmo de hash MD5) y almacenarse en la base de datos de la misma manera. Capturar las variables, usando algo como (utilizar algunos de validación para comprobar si las variables POST son válidas):

$username = $_POST['username']; 
$passwordHash = md5($_POST['password']); 

El nombre de usuario y contraseña con algoritmo hash se deben almacenar en su base de datos. A continuación, puede comprobar si hay una coincidencia en la base de datos usando:

$res = mysql_query("SELECT * FROM users WHERE username='".$username."' && password='".$password."'"); 

Cuando se encuentra un usuario, se utiliza sesiones para almacenar los valores de usuario, que le permitirán obtener acceso a una información de usuarios a través de las páginas. NOTA: session_start() generalmente se coloca en la parte superior de la página, pero la colocaré aquí para facilitar su lectura.

if (mysql_num_rows($res)) { 
    session_start(); 
    session_regenerate_id(); // regenerate session_id to help prevent session hijacking 
    $row = mysql_fetch_assoc($res); 
    $_SESSION['logged_on'] = true; 
    $_SESSION['username'] = $row['username']; 
    // add more session variables about the user as needed 
} 

En cada página que desea proteger, se agrega el siguiente al principio de estas páginas:

session_start(); 
if (!isset($_SESSION['logged_on'])) { 
    header("Location: login.php"); // user is not logged in, redirect to login page 
    exit; 
} 
// page content here 
6

Está bien, voy a explicar cómo el concepto básico va y una aplicación muy sencilla para poner las cosas en marcha.

PHP (y la mayoría de las aplicaciones web) confían en los servicios RESTful, lo cual nos preocupa que cada solicitud no esté vinculada remotamente a ninguna otra solicitud, ya sea por el mismo usuario u otros.

¿Qué significa eso?

Esto significa que para cada solicitud, debe hacer sus comprobaciones. Debe asegurarse de que el usuario tenga permisos para ejecutar esa página o, incluso con menos severidad, ver su contenido.

¿Cómo se consigue esto?

De muchas maneras, en realidad. Hay muchas técnicas utilizadas para aplicar la autorización en las aplicaciones web, pero básicamente se dividirían en dos, ya sea centralizadas o descentralizadas.

- centralizada

Esto significa que todas sus acciones (y controladores) están siendo manejados a través de un único archivo. Di index.php. Este archivo incluiría o delegaría sus tareas en otros archivos (que no son ejecutables por sí mismos a través de solicitudes normales) según los parámetros de solicitud. Este es un enfoque muy popular, pero no exactamente sencillo para los nuevos desarrolladores. Los ejemplos de aplicaciones que utilizan este enfoque tendrían URL del tipo: index.php? Do = register, index.php? Do = login, index.php? Do = showtopic & topic_id = 2, y así sucesivamente.

Una simple aplicación de esta técnica sería algo así:

<?php 
// index.php 
define('RUNNING_APP', true); 
// 1. place your auth code here, or... 
switch ($_REQUEST['do']) { 
    case 'register': 
     // 2. or here 
     include 'inc/register.php'; 
     break; 

    case 'do_register': 
     // 2. and here, and before every include.. and so forth. 
     include 'inc/do_register.php'; 
     break; 
} 
?> 

<?php 
// inc/register.php 
defined('RUNNING_APP') or die('Cannot access this script directly'); // make sure to break direct access 
?> 
<form action="index.php?do=do_register"> 
<!-- form elements --> 
</form> 

y así sucesivamente.

He documentado a dónde debería ir el código de autenticación habitual.

- descentralizada

uso de este enfoque, sin embargo, su código de autorización debe ir al principio de cada archivo. Las URL de aplicaciones de este tipo suelen tener el siguiente aspecto: register.php, login.php, etc. El principal problema aquí es que debe realizar toda la lógica de autenticación por archivo, como se indicó anteriormente, y puede ser un trabajo agitado si sus archivos aumentan en cantidad. Una solución conveniente es tener esa lógica en un solo archivo, e incluir ese archivo (que mataría la solicitud de personal no autorizado) antes de cualquiera de su lógica. Un ejemplo sencillo sería:

<?php 
// index.php 
include('inc/auth.php'); 
// index logic 
?> 

<?php 
// register.php 
include 'inc/auth.php'; 
// register logic 
?> 

<?php 
// inc/auth.php 
$logged_in = false; 
if (!$logged_in) { 
    die ('You do not have permission to access this page. Please login'); 
} 
?> 
Cuestiones relacionadas