无法让用户使用cookie或会话登录

时间:2016-10-24 18:57:17

标签: php

我遇到了一些麻烦。我正在研究一个小型的cms。当我登录一切都很好。但如果我坐在那里会议似乎要求我在3分钟后再次登录。所以我试着实现一个记住我的功能。而且也没有运气。它还需要我登录。

在我的函数中,我有以下代码片段。

function logged_in(){

    if(isset($_SESSION['email']) || isset($_COOKIE['email'])){
        return true;
    } else {
        return false;
    }
}

然后我创建了另一个函数,如果页面需要登录而你没有登录。它将重定向。

function require_loggin(){

    if (logged_in()) {} else {

        redirect(ROOT_URI);
    }
}

现在在需要登录的所有页面上,我都在页面的标题中有这个。

<?php require_loggin(); ?>

这是我登录页面的发布数据。

$email = clean($_POST['email']);
$password = clean($_POST['password']);
$remember   = isset($_POST['remember']);

最后我的登录。

function login_user($email, $password, $remember){

        $active = 1;

        $connection = dbconnect();
        $stmt = $connection->prepare('SELECT user_pwd, user_email, uid, username FROM users WHERE user_email = ? AND active= ?');
        $stmt->bind_param('ss', $email, $active);
        $stmt->execute();
        $result = $stmt->get_result();

        if ($result->num_rows == 1) {
            $row = $result->fetch_array();
            $db_password = $row['user_pwd'];

            if (password_verify($password, $db_password)) {

                if($remember == "on") {
        setcookie('email', $email, time() + 86400);
        }

                $_SESSION['uid'] = $row['uid'];
                $_SESSION['email'] = $row['user_email'];           
                $_SESSION['username'] = $row['username'];

                return true;
            } else {
                return false;
            }
            return true;
        } else {
            return false;
   }
}

一切正常,没有错误。登录和注销都很好..

  

问题是,一旦他们登录,默认会话将在大约4分钟内消失,如果他们没有点击链接。并记住我的功能不会工作..我读了一些默认会话应该持续约30分钟的地方。但会议要求在4分钟后不通过网站登录。

有人向我提到垃圾收集,但我不得不承认我完全迷失了它。

我仍然是相当新的PHP,我想学习正确的方法,而不是错误的方式。我的项目工作得很好,我无法让用户登录或让我记住我的功能。

7 个答案:

答案 0 :(得分:6)

我建议创建一个应用程序配置文件..将其命名为config.php并将其包含在页面顶部。就像您的应用程序一样简单,我假设您没有使用自动加载程序。在其中包含以下snippit:

<?php
    /**
     * File: config.php
     * This file should be included in every php script to configure the session. Like this:
     * require_once('config.php');
     */

    /*
     * This is 30 minutes. The length only depends on the requirements of 
     * your application. 
     */
    $sessionLength = 30 * 60; 
    ini_set(’session.gc_maxlifetime’, $sessionLength);
    ini_set(‘session.gc_maxlifetime’,30);

    session_set_cookie_params($sessionLength , "/", "yourdomain.com")
    session_name('PHPSESSION'); 
    session_start(); 
    //This will force the cookie to reset with a new timeout on every page load.
    setcookie( session_name(), session_id(), time() + $sessionLength );

?>

答案 1 :(得分:4)

更新

编辑问题的第9号已经非常显着地改变了这个问题,这个答案(以及大多数其他答案)已不再适用。

这个答案是对问题的第7号编辑的回应(当赏金开始时)。

将此留在此处,以便访问者知道为什么有这么多的答案和评论与会话长度&#34;当问题,就目前而言,并未引用它。在结束时会删除答案。

在浏览器中运行以下php文件:

<?php

echo 'Session Cookie Lifetime: '. ini_get('session.gc_maxlifetime') . ' (The number of seconds after which data will be seen as \'garbage\' and potentially cleaned up.)<br>';
echo 'Session Cookie Lifetime: '. ini_get('session.cookie_lifetime') . ' ( the lifetime of the cookie in seconds which is sent to the browser. The value 0 means &quot;until the browser is closed.&quot;)<br>';

phpinfo();

?>

如果顶部的两个值中的任何一个是&#34;大约4分钟&#34; (240秒)然后你需要在PHP配置中调整它们。

如果失败,下面的phpinfo()输出应该告诉您需要查找的所有信息:例如:

  • 如果您有另一个脚本从会话路径中删除了文件(请参阅&#34;会话保存路径&#34;中),那么您也会丢失会话;
  • 如果您不使用Cookie(我认为您是,否则您将在所有网址上看到PHPSESS参数),那么
  • 如果PHP / Apache / ISS等应该&#34;重启&#34;那么你将失去所有的会议
  • (不要被session.cache_expire = 180愚弄; 180分钟,而不是秒,与此无关。)

答案 2 :(得分:3)

基于您的问题的最新编辑(9),以及现在的代码框(请停止编辑问题和代码 - 如果它发生了很大变化,请创建一个新问题!)

您对login_user($email, $password)的调用未按照声明中的预期传递$remember变量

function login_user($email, $password, $remember)

所以它永远不会设置cookie。

提示:

  • 调试时,只需在代码中的各个点输入echo $remember . "<br>";echo "I'm Here<br>;echo "I'm at " . __FILE__ . "/" . __LINE__ . "<br>";或类似内容,以便了解其跟踪的位置。你会发现它永远不会进入“setcookie”行
  • 打开所有错误报告以进行调试/开发。 error_reporting(E_ALL);ini_set('display_errors', 'on');因为这会显示您的问题
  • 如果你使用cookie,不要存储易于解码的东西(比如你正在做的base64字符串),但是存储对你保存在服务器上的“永久会话”的引用。任何黑客都会立即识别出一个base64字符串(请参阅末尾的那些等号? - base64是第一个让人想到的东西)。我可以使用您的代码更改一个字母并以其他人身份登录。
  • 关于创建一个好的会话系统还有一些提示(例如,如果你使用cookie来“记住我”,那么你也可以不使用session_start()会话并自己完成所有这些)但是如果你不是100%确定你的逻辑和安全性,并且考虑到base64_decode问题,那么建议你应该使用库。希望你的verify_password不是自编的,而是商业的?非常适合学习,但如果您希望它能够上线,请让人在启动之前检查代码。
祝你好运

(请不要再改变问题了!没有人愿意帮助你。)

答案 3 :(得分:2)

首先尝试在您的&#39; session_start()&#39;之前添加此行。语句:

session_set_cookie_params(3600,"/");

如果这不起作用,您有3个选项:

1)将php.ini中此行的值更改为1800

session.gc_maxlifetime

2)将它放在.htaccess文件中:

php_value session.cookie_lifetime 1800
php_value session.gc_maxlifetime 1800

1800秒,所以它是半小时。

3)如果您无法访问.htaccess,可以将其放入标题中:

ini_set('session.cookie_lifetime','1800');  

Debian有一个cron作业,可以自动使安全措施的会话失效。如果你使用Debian检查/etc/cron.d/php *

资源:

http://php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime http://php.net/manual/en/function.session-set-cookie-params.php

答案 4 :(得分:0)

你还没有提到你如何使用logged_in函数?
当您关闭浏览器时,您的会话将被销毁,因此用户ID,用户名,电子邮件值将为空 检查cookie值是否基于cookie值设置后,您必须从数据库中获取相应的值并在会话中设置值。你必须遵循这种流程来实现持久登录系统。 我希望这个答案可以帮助你理解这个登录系统。

答案 5 :(得分:0)

检查罗比的回答。

如果您无法调整PHP配置,您也可以使用HTTP Auth。它不会过期。但是,在这种情况下,每次访问者请求网页时都会传输密码。

答案 6 :(得分:-3)

这是处理此问题的错误方法。 为了实现cookie自动登录,您应该将所有必需的登录数据存储在cookie中。但是你必须加密它们以防止以后出现问题。

示例Cookie:

toke = USER_ID:USER_NAME:HASHED_PASSWORD

冒号是分隔符,因此您可以使用explode来获取登录令牌的组件。然后,您可以使用数据库条目检查这些信息。

祝你好运!

相关问题