我在我的页面的 php 登录中添加一个简单的记住我功能时遇到问题?

Posted

技术标签:

【中文标题】我在我的页面的 php 登录中添加一个简单的记住我功能时遇到问题?【英文标题】:i'm having a problem with adding a simple remember me function in php log in my page? 【发布时间】:2019-04-06 06:34:52 【问题描述】:

我正在尝试在我的 login.php 代码中添加一个简单的记住我功能:

    <?php
    session_start();

    if(isset($_SESSION["comp"]))
        header("location view.php");//to redirect to the view page if already logged
        return;
        

    if (isset($_POST['cancel'])) 
        // Redirect the browser to index.php
        header("Location: index.php");
        return;


    /*
    if(isset($_POST['name']))
    // to save the name for the next page
    
    */

    $_SESSION['comp']=false;
    $salt = 'XyZzy12*_';
    $stored_hash = hash('md5', 'XyZzy12*_php123'); //the hash of the password php123 with some salt on it 


    if(isset($_POST['login']))  //when login is pressed

        $check = hash('md5', $salt . $_POST['pwd']); // to store the inserted password and compare it with the one that already stored\

        if(strlen($_POST['name']) < 1 ||strlen($_POST['email']) < 1 ||strlen($_POST['name']) < 1 )
            // if the inputs are empty redirect to login.php
            $_SESSION['error'] = "PLEASE don't leave any blank fields";
            

        elseif($check != $stored_hash)
            $_SESSION['error'] = "incorrect password";
            error_log("Login failed with ".$_POST['email']." using the password ".$_POST['pwd']);
            //header("Location: login.php");
           
        else
            $_SESSION['success'] = "you are logged in ";
            $_SESSION['comp']=true;
            $_SESSION['prs']  =  $_POST['name']; 

            error_log("Login success ".$_POST['email']);
            header("Location: view.php");
            //return;
        
        if(isset($_POST["stay"]))$_SEESION['loged']=true;
        
    ?>


    <!--the view code-->
    <!DOCTYPE html>
    <html>
    <head>
    <style>
    body 
        height: 1000px;
        background: linear-gradient(to top, #ff0000 0%, #ffcc00 100%);

        margin: 0;
        padding: 0;
    
    h1
        color : #000000;
        text-align : center;
        font-family: "SIMPSON";
    

    form 
        width: 300px;
        margin: 0 auto;

    

    </style>
    <title>logging in ....</title>
    </head>

    <body>

    <div class="container">
    <h1> Log in please :</h1>
    <?php
        if ( isset($_SESSION['error']) ) 
            echo('<p align= "center" style="color: red;">'.htmlentities($_SESSION['error'])."</p>\n");
            unset($_SESSION['error']);
        
        ?>

          <form method="POST" action="login.php" >
           <table>
           <tr>
             <td>Name :</td> <td><input type="text" maxlength="40" name="name"></td><br>
            </tr>
            <tr>
             <td>Email :</td> <td><input type="email" name="email" pattern="[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]2,$" ></td><br>
            </tr>
            <tr>
             <td>Password :</td> <td><input type="password" name="pwd"></td><br>
            </tr>
            <tr>
            <td></td><td><input type="radio" name="stay" value="1"> remember me<br>
            </tr>
            <tr>
             <td></td> <td><input align ="center"  type="submit"  name="login" value="login"> <input align ="center" type="submit" name="cancel" value="Cancel"></td><br>
            </tr>

           </table>
          </form>

    </body>

</html>

所以在输入值并选中单选框并提交登录后, 它应该在 $_SESSION 中存储一些数据 然后将显示查看页面,但是当我回到 login.php 页面时,什么也没有发生,

header("location:view.php");

不起作用。 任何人都可以帮助我并告诉我在哪里可以进行编辑以使其正常工作我是 php 的初学者,这是一个简单的培训项目

【问题讨论】:

不要使用 MD5,它可以在几分钟内被解密(暴力破解),不要暴露用户密码,这让我想到了当我不使用时,这应该如何记住任何人看那里没有 Cookie。我想说不要散列用户密码并将其存储在 cookie 中,但不要使用 cookie。 @ArtisticPhoenix 它只是一个培训应用程序,但主要问题是当我登录 view.php 并返回 login.php 时,即使我检查了记住我选项 it is just a training app 为什么你不想以错误的方式“训练”?只是想知道,因为 password_hash() 和 password_verify() 非常易于使用,比您上面所做的更容易。 @ArtisticPhoenix tnx 为您提供建议,我将搜索 thous 主题 当然,这不是问题我看到很多人都在为登录脚本而苦恼,而且很多时候他们不仅不安全,而且还在努力工作。可能正在使用过时的教程。这是一件非常必要的事情(用户持久性),但 10 次中有 9 次做错了。 【参考方案1】:

应该是header("location:view.php");

你的代码有错别字header("location view.php");

isset($_SESSION["comp"]) 也适用于 $_SESSION["comp"]=false

查看http://php.net/manual/en/types.comparisons.php

做:if(isset($_SESSION["comp"]) &amp;&amp; $_SESSION["comp"]==true)

【讨论】:

哦 tnx 很多,但是他们有没有关于单选框的提示以及如何使 $_POST['stay'] 工作?因为我使用 print_r 在视图页面中打印会话,但我无法在任何地方找到 $_SESSION['loged'] if(isset($_POST["stay"]))$_SEESION['loged']=true; 将其移至 header(location... 您在设置此会话并满足此 if 条件之前重定向到 view.php。之后做: $_SESSION['success'] = "你已登录"; $_SESSION['comp']=true; $_SESSION['prs'] = $_POST['name']; do if(!empty($_SESSION["comp"])) empty 不会给你未定义变量的错误,它会将虚假值视为空。 作为一个初学者,一个基本的调试技巧是做一个echo 'ok';出口;查看代码中可以到达的位置。您是否达到了旨在执行您想要的功能的代码。【参考方案2】:

您还需要首先使用session_start() 启动您的view.php 页面。任何你想使用会话的地方,你都必须声明它。

    <?php
session_start();

【讨论】:

我正在使用 session_start();在 view.php 中,但是当我从 view.php 回到 login.php 时,即使我选中了记住我选项,它也会要求我再次登录 因为你没有饼干,我自己喜欢燕麦片。让我解释一下会话通常有一个 cookie,它类似于 PHPSESSID,这是网站记住您的会话的方式,但是会话通常设置为大约 30 分钟,您需要在您的 cookie 中存储一些数据(不是密码)制作,然后您在客户端上有持久存储。【参考方案3】:

嗯,你的标题位置标签是错误的一件事

header("location view.php");

应该是

header("location: view.php");

那么这个函数范围之外的return 真的让我很烦,哈哈。它只是在语义上看起来是错误的。我会像通常那样使用exit

当然,这可能只是问题中的一个错字,测试本地我得到了这个

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。

请通过 admin@localhost 联系服务器管理员,告知他们此错误发生的时间,以及您在此错误之前执行的操作。

服务器错误日志中可能提供有关此错误的更多信息。

我应该联系他们并让他们知道吗?J/P

使用empty 而不是isset 来检查布尔值。

 $foo = false;
 var_dump(isset($foo));  //true - it is set
 var_dump(empty($foo));  //true - it is empty 

逻辑上为空是 isset 的反义词。在您检查 isset 的地方,您将检查不为空。我只是不想要双重否定。

然后如果它是未定义的(任何一个都不会发出错误)

 var_dump(isset($foo));  //false- it is not set
 var_dump(empty($foo));  //true - it is still empty 

也就是说如果(这两个条件在逻辑上是等价的):

  $foo = false;
  if(isset($foo)) //passes
  if(!empty($foo)) //fails


  //$foo = false;  <-- when its not set
  if(isset($foo)) //fails
  if(!empty($foo)) //fails  (fails if its false and if its not set)

因此将其应用于您的代码:

  if(isset($_SESSION["comp"]))
       header("location view.php");//to redirect to the view page if already logged
       return;
  
  ...
  $_SESSION['comp']=false;

下次加载页面时,$_SESSION['comp']为false,但也设置了,所以if条件通过。但是,如果您使用空,它的行为将与您预期的一样。希望我的解释在上面说得通,一旦你理解了它的工作原理,它就会变得显而易见。

empty 的问题出现在它用于检查诸如''[]0 之类的内容时,因为 PHP 的类型很松散,并且会将这些都视为 false 和 emtpy。如果您真的考虑它,那是有道理的。 [] 是一个空数组,'' 是一个空字符串,0 是一个空数字。但是,如果您认为 empty = isset 会绊倒您,因为他们做的事情非常不同。尽管它们在某种程度上可以互换。

其他东西

记住我的选项只有一种方式起作用,那就是在客户端浏览器中存储一个 cookie。会话使用它自己的 cookie,默认值类似于 PHPSESSID(我们要感谢 netscape)。要了解为什么需要 cookie,您必须了解对服务器的每个请求都是无状态且匿名的。

因为没有状态,也没有任何方法可以(可靠地)识别一个客户端和另一个客户端,所以我们使用 cookie。服务器给客户端的只是一点点数据说我就是我。即使您永远无法信任来自客户端的任何内容,这也为我们提供了一种在客户端上为客户端提供持久存储以识别它们的方法。

您不能使用会话来记住我,因为根据设计会话生命周期很短,通常约为 30 分钟。除此之外还有什么意义,如果他们的会话永不过期,您将永远不需要记住我的选项,我们也不会谈论(发短信)它。

在制作“简单”的记住我按钮时,需要处理大量安全问题。对很多人来说,我可以在这里的帖子中介绍。也就是说,以正确的方式去做真的并不比任何其他方式更难。

有一天当我把我的网站重新组合在一起时,我计划发布一个完整的用户系统作为它的教程。但随着 PHP5 接近灭绝,我一直忙于做很多事情(除了修复旧网站)。

干杯。

【讨论】:

@MosaAbbas - 我应该是我专业编程近十年了.. 哈哈。

以上是关于我在我的页面的 php 登录中添加一个简单的记住我功能时遇到问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用php重定向登录页面

Laravel:添加make:auth后在我的登录/注册页面中出错

如何在Asp.net Core的登录过程中为“记住我”设置单个cookie超时?

有没有一种简单的方法可以将谷歌登录按钮添加到 HTML 文件?

PHP登录系统:记住我(持久cookie)[重复]

将过期时间添加到 Spring Security 记住我的 cookie