php密码保护的网站

时间:2010-08-09 21:40:10

标签: php authentication

我是网络编程的新手,我正在尝试找到一些关于如何创建一个网站的好例子/教程,这个网站要求用户登录以查看主登录页面之外的任何页面。 / p>

到目前为止,我已经找到了1或2,我已经尝试过,但我一直遇到同样的问题。如果我只是输入页面的网址,我想手动查看,我可以进入,就像那里什么也没有。

7 个答案:

答案 0 :(得分:6)

好的,我将解释基本概念是如何进行的,以及一个非常简单的实现方法。

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

那是什么意思?

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

这是如何实现的?

实际上,通过多种方式。有许多技术用于对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等。这里的主要问题是你需要为每个文件执行所有auth逻辑,如上所述,如果你的文件数量增加,这可能是一个繁忙的工作。一个方便的解决方案是将该逻辑放在一个文件中,并在任何逻辑之前包含该文件(这会杀死对unauth personel的请求)。一个简单的例子是:

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

答案 1 :(得分: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

答案 2 :(得分:1)

有HTTP Auth:

http://php.net/manual/en/features.http-auth.php

或者您可以使用登录表单和会话跟踪自行推送:

http://www.php.net/manual/en/book.session.php

Http auth意味着用户获得一个弹出对话窗口,要求输入用户名和密码,这比自动滚动版本更常见。

享受!

答案 3 :(得分:1)

这与LordArtemis建议的内容相同,但本教程更容易理解并面向初学者。

http://css-tricks.com/easily-password-protect-a-website-or-subdirectory/

答案 4 :(得分:1)

您提到的网站可能会被绕过,因为通过安全检查的网页不会保存,然后会检查每个网页上的登录状态。在授予对页面的访问权限之前,您需要检查访问者是否已登录。

答案 5 :(得分:1)

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

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

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

Johnny的密码实际上是“foobar”,但数据库存储md5('foobar')。当Johnny尝试登录时,他输入了他的用户名('Johnny')和他的密码('foobar')。在PHP中,您对输入的密码进行哈希处理,并从数据库中调用其密码值,从而产生:

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

此条件为true。您可以确认他是否正确登录,但您从未存储他的实际密码。

Alice的密码是'foobaz'。她试图登录,但不小心输入了'foobar',Johnny的密码。结果如下:

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

哪个是false。再一次,你不知道Alice的密码是什么,只是她输错了。

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

答案 6 :(得分:0)

它没有使用PHP进行身份验证,但您可以使用htaccess提供身份验证,并可能使用PHP管理.htpasswd文件:

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