2010-08-09 274 views
6

我是新来的网络编程和即时通讯尝试找到一些很好的例子/教程如何做一个体面的工作创建一个网站,要求用户登录查看主日志之外的任何页面在页面中。php密码保护网站

到目前为止,我发现1或2,我尝试过,但我一直遇到同样的问题。如果我只是输入我想要手动查看的页面的网址,我可以进去,就像没有任何东西。

+0

这是tutoral香港专业教育学院迄今下,我不认为它的工作 http://www.phpeasystep.com/phptu/6.html – Crash893 2010-08-09 21:40:51

+0

也许我看错问题是,你是否需要一个全功能的用户登录系统(例如,不同的用户需要看到不同的东西),还是你不希望每个人都能够查看你的网站?在我看来,htaccess是要走的路。 – williamg 2010-08-09 22:34:20

+0

我希望能够让用户和管理员以及超级用户拥有 – Crash893 2010-08-10 04:54:40

回答

0

它不使用PHP进行身份验证,但您可以使用htaccess的提供认证和使用PHP可能管理htpasswd文件:

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

+1

他想要php,而不是apache配置,不要下主题 – 2010-08-09 23:05:11

+0

他说他是网络编程的新手,他正在寻找一种创建网站的方法,要求用户登录才能查看超出主网页的任何页面登录页面。 .htaccess是这样做的一种方法,他可能没有想到。他从来没有说过解决方案必须在PHP中。 – 2010-08-10 14:49:08

+0

我仍然想要做php,但是这会帮助我完成一个不同的项目,所以对于这个想法+1(我不知道谁是你) – Crash893 2010-08-10 14:50:22

1

你提到的网站很可能因为旁路过安全检查的页面不保存,然后检查每一页上的登录状态。在访问页面之前,您需要检查访问者是否已登录。

1

我想大多数用户都希望登录时输入表单。如果您希望用户在会话过期后回来并使用同一帐户登录,则需要数据库来存储用户信息。

将用户信息存储在数据库中时,您可能实际上也不应该存储其密码。举一个例子:

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

约翰尼的密码实际上是“foobar的”,但数据库存储md5('foobar')。当Johnny尝试登录时,他输入他的用户名('Johnny')和他的密码('foobar')。在PHP中,你凑他输入的密码,并从数据库中调出他的密码值,从而导致:

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

此条件是true。您可以确认他是否正确登录,但您永远不会存储他的实际密码。

爱丽丝的密码是'foobaz'。她试图登录,但不小心输入了'foobar',Johnny的密码。这导致:

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

这是false。再一次,你不知道Alice的密码,只是她输入了错误的密码。

当然,这种策略的缺点是,当他们忘记密码时,你无法告诉用户他们的密码 - 你不知道!您可以通过让用户将其密码重置为来解决此问题(对某些半随机字符串),而不是直接告诉他们密码是什么。

+1

请注意,如果你不得不为每个用户存储单独的信息。如果你只是需要某些人看到部分或整个网站,这可能是矫枉过正的。 – williamg 2010-08-09 22:08:04

2

使用表单登录时,应该检查数据库中的用户名和密码。密码应该被加密(通常使用MD5哈希算法完成),并以相同的方式存储在数据库中。您捕捉的变量,使用类似(使用一些验证检查,如果POST变量是有效的):

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

用户名和散列密码应存储在数据库中。然后,您可以检查使用数据库匹配:

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

当用户发现,使用会话来存储用户值,这将让你可以访问跨页一个用户的信息。注意:session_start()通常放置在页面的顶部,但为了便于阅读,我将它放在此处。

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 
} 

在要保护的每一页,添加以下这些页面的顶部:

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

好吧,我会解释的基本概念如何去和一个非常简单的实现,以让事情继续下去。

PHP(以及大多数Web应用程序)依赖于RESTful服务 - 这是我们目前关注的问题,意味着每个请求都不会受到任何其他请求的远程绑定 - 无论是由同一用户还是其他用户。

那么这是什么意思?

这意味着对于每一个请求,你都需要做检查。您需要确保用户是否有权执行该页面,或者甚至看不到其内容。

这是如何实现的?

实际上有很多种方式。有很多技术用于强制Web应用程序的授权,但它们基本上都会分解为两个中的一个 - 无论是集中还是分散。

- 集中

这意味着你的所有行动(和控制器)正在通过一个单一的文件来处理。说index.php。然后,该文件将根据请求参数将其任务包括或委托给其他文件(不能通过普通请求自行运行)。这是一种非常受欢迎的方法,但对于新开发人员来说并不是直截了当的。使用这种方法的应用程序的示例将具有以下类型的URL:index.php?do = register,index.php?do = login,index.php?do = showtopic & topic_id = 2等等。

一个简单的实现这一技术的会是这样的:

<?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> 

等等。

我已经记录了通常的认证代码应该去的地方。

- 分散

使用这种方法,但是,您的授权码应该在每一个文件的开头。这种应用程序的URL通常类似于:register.php,login.php等等。这里的主要问题是,如上所述,您需要为每个文件执行所有认证逻辑,并且如果您的文件数量增加,这可能是一件繁忙的工作。一个方便的解决方案是将这个逻辑放在一个单独的文件中,然后在你的任何逻辑之前包含该文件(这会杀死对非法人员的请求)。一个简单的例子是:

<?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'); 
} 
?>