代码之家  ›  专栏  ›  技术社区  ›  Crash893

php密码保护网站

  •  6
  • Crash893  · 技术社区  · 16 年前

    我对网络编程很陌生,我想找一些好的例子/教程来说明如何创建一个需要用户登录才能查看主登录页以外的任何页面的网站。

    到目前为止,我已经找到1或2,我尝试,但我不断遇到同样的问题。如果我只是手动输入我想看到的页面的url,我就可以像什么都没有一样进入。

    7 回复  |  直到 13 年前
        1
  •  1
  •   Robin    16 年前

    有HTTP身份验证:

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

    或者,您也可以使用登录表单和会话跟踪来启动自己的程序:

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

    好好享受!

        2
  •  6
  •   kamasheto    16 年前

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

    PHP(和大多数web应用程序)依赖于RESTful服务——就我们目前所关注的问题而言,这意味着每个请求都不会远程绑定到任何其他正在发出的请求——无论是由同一个用户还是其他用户发出的。

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

    实际上,在很多方面。有许多技术用于在web应用程序上实施授权,但它们基本上都可以分解为两种技术之一——集中或分散。

    --集中化

    这意味着您的所有操作(和控制器)都是通过单个文件处理的。说index.php。然后,该文件将根据请求参数将其任务包含或委托给其他文件(这些文件本身不能通过正常请求运行)。这是一种非常流行的方法,但对于新开发人员来说并不完全是直接的。使用此方法的应用程序示例的URL类型为:index.php?do=register、index.php?do=login、index.php?do=showtopic&topic\u 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');
    }
    ?>
    
        3
  •  2
  •   Mads Mogenshøj    16 年前

    使用表单登录时,应检查数据库中的用户名和密码。密码应该被置乱(通常使用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
    
        4
  •  1
  •   kevtrout    16 年前

        5
  •  1
  •   Brian S    16 年前

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

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

    约翰尼的密码实际上是“foobar”,但数据库存储 md5('foobar') . 当Johnny尝试登录时,他输入用户名('Johnny')和密码('foobar')。在PHP中,您对他输入的密码进行哈希运算,然后从数据库中调用他的密码值,结果是:

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

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

    爱丽丝的密码是“foobaz”。她试图登录,但不小心输入了“foobar”,约翰尼的密码。这将导致:

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

    哪个是 false ,只是她进错了。

    当然,这种策略的缺点是,当用户忘记密码时,你不能告诉他们密码是什么——你不知道!您可以通过让用户 复位