我如何阻止非特权用户的部分内容

How i block part of the content for unprivileged users

我正在做一个网站,我想阻止用户在他或她完成一些预定义的目标之前访问内容。

例如,我想阻止用户去我页面的某个地方,直到他们去另一个地方。喜欢阻止没有适当级别的人访问网络的那部分。

我想尽可能避免使用密码。

我将在我网页的几个部分中使用它。

感谢您的帮助。

这是您问题的一个简单示例:

  1. index.php 将用户重定向到 login.php 如果指定的 $_SESSION 变量不存在。

  2. login.php 包含基本的 account/password 形式。 login.php用AJAX调用checkLogin.php检查account/password是否正确。

  3. checkLogin.php 通过将用户输入与数据库中的数据进行比较来检查 account/password 是否正确(mySQL 在这个例子中)。

  4. 如果 account/password 正确,checkLogin.php 启动 $_SESSION["account"] 并将用户重定向回来至 index.php.


index.php

<?php
session_set_cookie_params(0);
session_start();
ob_start();

// Redirect to login.php if $_SESSION["account"] is not set
$url = "login.php";
if(isset($_SESSION["account"])!=true)
{
    header('Location: '.$url);
    exit;
}
?>

<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <!-- Your secret contents here-->
    <h1>Hello, your name is:</h1>
    <?php echo $_SESSION["account"]; ?>
</body>

login.php

<!DOCTYPE html>

<html>
<head>
    <meta charset="utf-8">
    <script type="text/javascript">
        function AjaxCheck()
        {
        if(document.getElementById("account").value==""){
            document.getElementById("div_message").innerHTML = "You are not logged in.";
            return;
        };
        if (window.XMLHttpRequest)
          {// code for IE7+, Firefox, Chrome, Opera, Safari
          xmlhttp=new XMLHttpRequest();
          }
        else
          {// code for IE6, IE5
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
          }
        xmlhttp.onreadystatechange=function()
          {
          if (xmlhttp.readyState==4 && xmlhttp.status==200)
            {
            if(xmlhttp.responseText.match("redirect")){
                window.location.href =  "index.php";
            }
            else{document.getElementById("div_message").innerHTML=xmlhttp.responseText;}
            }
          }
          // Use HTTP get to send user input account/password to checkLogin.php
        xmlhttp.open("GET","checkLogin.php?account="+document.getElementById("account").    value+"&password="+document.getElementById("password").value,true);
        xmlhttp.send();
        }
    </script>
</head>
<body>
    <form>
        <p>Account: </p>
        <input type="text" name="account" id = "account"/>
        <p>Password: </p>
        <input type="password" name="password" id = "password" />
        <br>
        <a class="btn btn-primary" onClick = "AjaxCheck()">Login</a>
    </form>
    <div id = "div_message" >
        div_message text
    </div>
</body>

checkLogin.php

<?php
session_set_cookie_params(0);
session_start();

// NOTE: In real world, you should do some sanitization first
$account=$_GET["account"];
$password=$_GET["password"];

checkIfLogin();

function checkIfLogin(){
    $con = mysql_connect("localhost","YourDatabaseAccount","YourDatabasePassword");
    if (!$con){die('Could not connect: ' . mysql_error());} 

    mysql_select_db("YourDB", $con);
    $result = mysql_query("SELECT * FROM `YourTable` WHERE `Account` = '".$GLOBALS['account']."' "    );    
    $row = mysql_fetch_array($result);
    if($row==NULL){echo "This account does not exist"; mysql_close($con); return;}
    if(strcmp($row['Password'],SHA1($GLOBALS['password']))==0){
        $_SESSION['account'] = $GLOBALS['account']; 
        echo "redirect" ;
    }
    else{echo "Incorrect Password" ;}

    mysql_close($con);
}

?>

备注

  1. 上面的示例代码 "work" 但应该考虑 "dirty",只是一个简单的例子。

  2. 我知道您希望答案尽可能简单,但是 account/password 的示例应该能让您了解会话或 cookie 的工作原理。以后可以按照自己喜欢的方式实现。

  3. 您可能会发现这些 sites/topics 有用:

P.S。其实你不需要 AJAX 来实现你的目标,但为什么不了解更多呢? :)


编辑:如果您没有可用的数据库,这里有一个简单的 checkLogin.php,它只允许用户 "John" 和密码“123”通过。

<?php
session_set_cookie_params(0);
session_start();

$account=$_GET["account"];
$password=$_GET["password"];

checkIfLogin();

function checkIfLogin(){
    if(strcmp($GLOBALS['account'],"John")!=0){
        echo "Invalid Account";
    }else if(strcmp($GLOBALS['password'],"123")!=0){
        echo "Incorrect Password";
    }
    else{
        $_SESSION['account'] = $GLOBALS['account'];
        echo "redirect" ;
    }
}

?>

您可以使用 php 会话来执行此操作。在您要限制访问的页面上可以包含以下代码:

<?php
session_start() // this starts the php session
if($_SESSION['auth'] !== 'true') // this checks if the session variable "auth" 
                                 // is not true
{
    header("Location: /homepage.php"); // if "auth" is not true, it will redirect 
                                       // back to your home page. you can switch 
                                       // out "/homepage.html" with whatever your 
                                       // actual page is.
}
?>
<html>
<body>Rest of html content...

主页看起来像这样:

<?php
session_start(); // starts the session
$buttonClicked=$_POST['access']; // checks to see if the button has been clicked 
if($buttonClicked) {
    $_SESSION['auth'] = 'true'; // sets the session variable auth to true so user 
                                // can have access to other page
    header("Location: /otherpage.php"); // sends the user to the other page
}
?>
<html>
<body>
    <form method="post" action="homepage.php">
        <input type="submit" value="Go to other page" name="access" />
    </form>
</body>
</html>

当用户单击 html 按钮时,它将把他们发送到 "otherpage.php",他们将能够进入。两个页面都需要是 .php 而不是 .html虽然。