PHP - 使用登录系统保护仅限会员的页面

Posted

技术标签:

【中文标题】PHP - 使用登录系统保护仅限会员的页面【英文标题】:PHP - Secure member-only pages with a login system 【发布时间】:2016-04-16 12:22:03 【问题描述】:

您好,我被自己编写的 php 代码难住了。我盯着这个看了好几个小时都没有成功,请帮助找出我显然已经解决的任何错误。

我想要这个脚本做的是从一个 html 表单页面,查询一个数据库表('users')以确保他们的密码和用户名是正确的,然后在一个单独的表('tokens')中插入一个随机令牌(我之前使用的方法,它有效)到“tk”列,用户一般身份验证。从 'users' 表中提取的代码到 'tokens' 表中的 'gauth' 列中。

额外的一般身份验证的原因是我可以提取他们的用户名并将其显示在我计划“保护”的所有页面上

对不起,如果我感到困惑,这是我能改进的最好的。另外,我不擅长格式化:)。我稍后会添加一些html,这就是标签存在的原因。

mysql 表:

用户示例:

cols:        username  | password  |    email              | classcode | tcode   | genralauth |
             hello     | world     | hello.world@gmail.com | 374568536 | somthin | 8945784953 |

代币示例:

cols:          gauth   |      tk      |
            3946893485 |wr8ugj5ne24utb|

PHP:

<html>
<?php
session_start();
error_reporting(0);
$servername = "localhost";
$username = "-------";
$password = "-------";
$db = "vws";
?>
<?php
// Create connection
$conn = new mysqli($servername, $username, $password, $db);

// Check connection
if ($conn->connect_error) 
die("Connection failed: " . $conn->connect_error);
 
?>
<?php
$sql1 = "SELECT username FROM users";
$data1 = $conn->query($sql1);

if ($conn->query($sql1) === TRUE) 
    echo "";

?>
<?php
$sql2 = "SELECT password FROM 'users'";
$data2 = $conn->query($sql2);

if ($conn->query($sql2) === TRUE) 
    echo "";

?>
<?php
$bytes = openssl_random_pseudo_bytes(3);
$hex = bin2hex($bytes);
?>
<?php
if($_POST['pss'] == $data2 and $_POST['uname'] == $data1) 
    $correct = TRUE;

else 
    $correct = FALSE;

?>
<?php
    if ($correct === TRUE) 
        $sql3 = "SELECT generalauth FROM users WHERE password='".$_POST['pss']."'";
        $result3 = $conn->query($sql3);
    
?>
<?php
    if ($correct === TRUE) 
        $sql4 = "INSERT INTO tokens (tk,gauth) VALUES (".$hex."' ,       '".$result3."')";

        if ($conn->query($sql4) === TRUE) 
            echo "New token genrated.";
         else 
            echo "Error: " . $conn->error;
        
    
?>
<?php
    if ($correct === TRUE)  ?>
    <p>Succesfuly loged in!</p><br/>
    <a href="../index.php<?php echo " ?view=teacher";?>"><button>Continue</button></a><br/>
<?php

elseif ($correct === FALSE)  ?>
    <p>Incorrect, please try again.</p><br/>
    <a href="../login.php"><button>Back</button></a><br/>
<?php

?>
<?php
if ($correct === TRUE) 
$_SESSION['auth'] = $hex;
$_SESSION['logstat'] = TRUE;

?>
<?php
if ($correct === FALSE) 
$_SESSION['logstat'] = FALSE;   

$conn->close();
?>

这是我将在大多数页面上用于令牌身份验证的 PHP,但它实际上并不检查数据库“令牌”,我还需要一种使用常规身份验证显示登录用户用户名的方法。

PHP:

<html>
<h1 class="title">Virtual Work Sheets!</h1> 
<a href="login.php"><p class="h_option">[Log In / Register]</p></a><hr/>
<div class="body">
<?php
session_start();
error_reporting(0);
$servername = "localhost";
$username = "root20";
$password = "jjewett38";
$db = "vws";
?>
<?php
// Create connection
$conn = new mysqli($servername, $username, $password, $db);

// Check connection
if ($conn->connect_error) 
die("Connection failed: " . $conn->connect_error);
 
?>
<?php
$sql = "SELECT tk FROM tokens";
$data = $conn->query($sql);

?>
<?php
if (!$_GET['tk'] == $data) 
    echo "
    <p>Invalid token, please consider re-logging.</p>
    ";

else 
?>
<?php
switch ($_GET['view']) 
    case teacher:
?>

教师页面html在这里...

<?php 
    break;
    case student:
?>

学生页面 html 在这里...

<?php
    break;
    default:
        echo "Please login to view this page.";

?>
</html>

【问题讨论】:

FROM 'users' 语法错误。 php.net/manual/en/mysqli.error.php 这对你没有帮助 error_reporting(0); 【参考方案1】:

我建议你改变你的方法。

虽然乍一看这些示例文件看起来很多,但一旦你研究它们,你会发现它确实比你现在的方向更简单和合乎逻辑。

首先,将 db connect / login 内容移到一个单独的文件中,并将 requireinclude 该文件放在每个 PHP 页面的顶部:

INIT.PHP

    // Create connection
    $conn = new mysqli($servername, $username, $password, $db);

    // Check connection
    if ($conn->connect_error) 
    die("Connection failed: " . $conn->connect_error);
     

    //Might as well also load your functions page here, so they are always available
    require_once('fn/functions.php');
?>

现在,看看我们如何在索引(和受限)页面上使用它?

INDEX.PHP

<?php
    require_once('inc/head.inc.php');
    require_once('fn/init.php');
?>

<body>
    <!-- Examples need jQuery, so load that... -->
    <script src="https://code.jquery.com/jquery-1.11.3.js"></script>
    <!-- and our own file we will create next... -->
    <script type="text/javascript" src="js/index.js"></script>

    <div id="pageWrap">
        <div id="loginDIV">
            LoginID: <input type="text" id="liID" /><br>
            LoginPW: <input type="password" id="liPW" /><br>
            <input type="button" id="myButt" value="Login" />
        </div>
    </div>

JS/INDEX.JS

$(function()
    $('#myButt').click(function()
        var id = $('#liID').val();
        var pw = $('#liPW').val();
        $.ajax(
            type: 'post',
             url: 'ajax/login.php',
            data: 'id=' +id+ '&pw=' +pw,
            success: function(d)
                if (d.length) alert(d);
                if (d==1) 
                    window.location.href = 'restricted_page.php';
                else
                    $('#liID').val('');
                    $('#liPW').val('');
                    alert('Please try logging in again');
                
        
        );
    );//END myButt.click

); //END document.ready

AJAX/LOGIN.PHP

<?php
    $id = $_POST['id'];
    $pw = $_POST['pw'];

    //Verify from database that ID and PW are okay
    //Note that you also should sanitize the data received from user

    if ( id and password authenticate )
        //Use database lookups ot get this data: $un = `username` 

        //Use PHP sessions to set global variable values
        $_SESSION['username'] = $un;
        echo 1;
    else
        echo 'FAIL';
    

RESTRICTED_PAGE.PHP

<?php
    if (!isset($_SESSION['username']) )
        header('Location: ' .'index.php');
    

    require_once('inc/head.inc.php');
    require_once('fn/init.php');
?>
<body>
    <h1>Welcome to the Admin Page, <?php echo $_SESSION['username']; ?>
    <!--  AND here go all teh restricted things you need a login to do. -->

More about AJAX - study the simple examples

【讨论】:

谢谢!稍后我将不得不详细了解这一点,但是我不知道 javascript(这对我来说真的很困惑),这可能会在将来成为一个问题,因为我会在页面中添加更多功能。我有点想我的答案在 javascript 中:)。我通常不会问,但可以选择 Skype 吗? 我已经了解 php,目前正在通过您的链接学习 AJAX,但是当有 W3 学校参考时,我不打算花钱编码。谢谢你。

以上是关于PHP - 使用登录系统保护仅限会员的页面的主要内容,如果未能解决你的问题,请参考以下文章

如何在会员网站上使用贝宝 IPN (PHP)

登录到管理员 - 使用 PHP 和 MySQL 的会员网站 - 登录不起作用

vue+element ui+腾讯云开发打造会员管理系统之实战教程系统登录

PHP-会员登录与注册例子解析-学习笔记

使用HttpClient访问被保护资源

PHP - 使用用户配置文件保护用户权限