PHP会话:预设登录详细信息只能在本地工作


PHP Session: Preset login details only working locally

我正在一个网站上工作,我决定为它制作自己的CMS。它不需要惊人的安全性,但我有一个登录页面,如果登录信息填写正确,它会指向CMS页面。

只能使用1个帐户(管理员)登录。它的登录名和密码是在登录页面PHP文件中设置的。当提交表单时,它会检查是否填写了正确的信息,如果填写了,它会将用户名放入SESSION[user]变量中。

只要该会话存在,登录页面就应该始终自动将您引导到CMS页面,但这似乎只能在本地工作。当我把它放在网上,填写正确的信息并在登录页面上提交表格时,它只是停留在同一页面上,而不是转到CMS页面。当我手动键入cms页面的URL时,我可以访问它,而无需指向登录页面。在我的PHP中,我确实检查$_SESSION['user']==admin。

你们中有人知道为什么这只在本地工作,我需要改变什么才能让它在网上工作吗?

以下是相关代码:

//登录PHP页面

<?php
session_start();
    //login info
    $xinlognaam = 'admin';
    $xwachtwoord = 'PASSWORD HERE';
    //als je al ingelogd bent, wordt je direct naar cms pagina gestuurd
    if(!empty($_SESSION['user'])){
        if($_SESSION['user'] == $xinlognaam){
            header("Location: ../php/cms.php");
        }
    }
?>
    <div id="inlogsectie">
        <form id="inlogform" method="POST" action="#">
            Accountnaam:<br><br>
            <input type="text" name="accountnaam" id="accountnaam" maxlength="100"/><br><br><br>
            Wachtwoord:<br><br>
            <input type="text" name="wachtwoord" id="wachtwoord" maxlength="100"/><br><br><br>
            <input type="submit" name="inlogknop" id="inlogknop" value="inloggen"/>
        </form>
        <div id="inlogmelding">
            <?php
                //als op de knop gedrukt wordt
                if(isset($_POST['inlogknop'])){
                    //als velden niet leeg zijn
                    if(!empty($_POST['accountnaam']) && !empty($_POST['wachtwoord'])) {
                        //als de gegevens correct zijn
                        if(($xinlognaam == $_POST['accountnaam']) && ($xwachtwoord == $_POST['wachtwoord'])){
                            $_SESSION['user'] = $xinlognaam;
                            header("Location: ../php/cms.php");
                        //als de gegevens incorrect zijn
                        }else{
                            echo"De ingevulde login informatie is incorrect.";
                        }
                    } else{ //als velden leeg zijn
                        echo"De ingevulde login informatie is incorrect.";
                    }
                }
            ?>
        </div>
    </div>

//CMS页面

 <?php
  session_start();
 if($_SESSION['user'] != 'admin'){
        header('Location: ../admin/index.php');
    }
 if(isset($_POST['uitlogknop'])){
        include_once('uitloggen.php');
    }
   ?>

//注销PHP文件

<?php
session_destroy();
header("Location: ../admin/index.php");
?>

首先,内容发送到浏览器后,不能设置header()。所以你的登录页面会出现问题。我建议:

<?php
session_start();
//login info
$xinlognaam = 'admin';
$xwachtwoord = 'knipwerk';
$html = "";
//als je al ingelogd bent, wordt je direct naar cms pagina gestuurd
if(!empty($_SESSION['user'])){
    if($_SESSION['user'] == $xinlognaam){
       header("Location: ../php/cms.php");
    }
}
//als op de knop gedrukt wordt
if(isset($_POST['inlogknop'])){
    //als velden niet leeg zijn
    if(!empty($_POST['accountnaam']) && !empty($_POST['wachtwoord'])) {
        //als de gegevens correct zijn
        if(($xinlognaam == $_POST['accountnaam']) && ($xwachtwoord == $_POST['wachtwoord'])){
            $_SESSION['user'] = $xinlognaam;
            header("Location: ../php/cms.php");
            //als de gegevens incorrect zijn
        } else {
            $html .= "De ingevulde login informatie is incorrect.";
        }
    } else {
        //als velden leeg zijn
        $html .= "De ingevulde login informatie is incorrect.";
    }
}
?>
<html>
<body>
<div id="inlogsectie">
    <form id="inlogform" method="POST" action="#">
        <p><label>Accountnaam:</label>
        <input type="text" name="accountnaam" id="accountnaam" maxlength="100"/></p>
        <p><label>Wachtwoord:</label>
        <input type="text" name="wachtwoord" id="wachtwoord" maxlength="100"/></p>
        <p><input type="submit" name="inlogknop" id="inlogknop" value="inloggen" /></p>
    </form>
    <div id="inlogmelding">
    <?php echo $html; ?>
    </div>
</div>
</body>
</html>

用于重定向的header()函数只有在尚未发送任何内容的情况下才起作用。发送内容后,无法修改HTTP标头,因为它已经从服务器发送到客户端。

这意味着,如果将对header()的调用放在任何HTML之后(即使它只是一个<html>标记或单个echo,甚至是打开<?php之前的一个空格),它也可能不起作用。我说可能,因为有时服务器在生成的那一刻并没有发送所有内容,因此仍然可以编辑HTTP标头。

因此,解决方案是将header()调用移动到页面的最顶部。更多信息可以在PHP文档中找到。

此外,不要将您的密码发布到Stack Overflow。:-)

这将解决您的问题:

> <?php session_start() ?>
> 
> <?php 
> 
> 
> if(isset($_SESSION['login_user'])) {  header('Location:
> ../php/cms.php'); } else {
> 
> ?>    <div id="inlogsectie">
>         <form id="inlogform" method="POST" action="">
> 
>             Accountnaam:<br><br>
>             <input type="text" name="accountnaam" id="accountnaam" maxlength="100"/><br><br><br>
> 
>             Wachtwoord:<br><br>
>             <input type="text" name="wachtwoord" id="wachtwoord" maxlength="100"/><br><br><br>
> 
>             <input type="submit" name="inlogknop" id="inlogknop" value="inloggen"/>
>         </form> <?php  }  if(isset($_POST['inlogknop'])) {
>               if(!empty($_POST['accountnaam']) && !empty($_POST['wachtwoord'])){
>                       if(($xinlognaam == $_POST['accountnaam']) && ($xwachtwoord == $_POST['wachtwoord'])){
>               
>               $_SESSION['user'] = $xinlognaam;
>                 header('Location: ../php/cms.php');           } else {
>           
>               echo"De ingevulde login informatie is incorrect.";
>                           }
>                   }else {
>                       echo"De ingevulde login informatie is incorrect.";      }   }    ?>