【问题标题】:My session does not persist on other pages我的会话不会在其他页面上持续存在
【发布时间】:2017-12-01 18:46:49
【问题描述】:

我制作了一个自定义代码来保留该部分,我很快就在一个页面上,我返回到同一页面,会话保存并返回登录成功。

但当我要保存此页面上表单中的信息时,我会检查我是否已登录,并在失败时返回。

我还注意到,当我登录并通过导航菜单进入另一个检查登录的页面时,会话 tbm 不会保留。

有谁知道它可以是什么,或者你发现我在这些功能中缺少什么?

登录后保存表单信息的方法

  <? php
    include_once 'functions.php';

    sec_session_start ();

    $ error_msg = "";
    $ page = "postar.php";

    if (isset ($ _ POST [post]) && $ _POST [post] == ​​"Upload") {
      $ Image = "";

      if (isset ($ _ FILES [btcapa]) &&! empty ($ _ FILES [btcapa] [name])) {
        $ btimage = $ _FILES [btcapa];
        switch ($ _ POST [sacervo]) {
          case '1':
            $ update = "img / comic";
            break;
          case '2':
            $ update = "img / books";
            break;
          case '3':
            $ updir = "img / files";
            break;
        }
        $ Image = valida_upload ($ btimage, $ update);
        if ($ Image [0] == '<') {
        $ error_msg. = "<li> Document: not loaded." $ btimage [name]. "</ li>";
        $ error_msg. = $ Image;
        $ Image = '';
      }
    }

    if (login_check ($ mysqli) == true) {
      switch ($ _ POST [sacervo]) {
        case '1':
          $ error_msg. = valida_gibis ($ mysqli, $ Image);
          break;
        case '2':
          $ error_msg. = validate_book ($ mysqli, $ Image);
          break;
        case '3':
          $ error_msg. = validate_files ($ mysqli, $ Image);
          break;
      }
      if ($ error_msg == '') {
        if (! empty ($ Image)) {$ upload = move_uploaded_file ($ _ FILES [btcapa] [tmp_name], $ Image); }

        $ msg_sucesso = "<li> Successfully inserted. </ li>";
        header ('Location: ../'.$page.'?retorno='.$msg_sucesso);
      } else {
        header ('Location: ../'.$page.'?retorno='.$error_msg);
      }
    } else {
      $ error_msg. = "<li> Could not insert, please log back in. </ li>";
      header ('Location: ../postar.php?retorno='.$error_msg);
    }
    }
  ?>

个人登录功能

function sec_session_start() {
        $session_name = 'SESSION';   // Estabeleça um nome personalizado para a sessão
        $secure = SECURE;
        // Isso impede que o JavaScript possa acessar a identificação da sessão.
        $httponly = true;
        // Assim você força a sessão a usar apenas cookies. 
       if (ini_set('session.use_only_cookies', 1) == FALSE) {
            header("Location: ../error.php?err=Could not initiate a safe session (ini_set)");
            exit();
        }
        // Obtém params de cookies atualizados.
        $cookieParams = session_get_cookie_params();
        session_set_cookie_params(time()+3600,
            $cookieParams[path], 
            $cookieParams[domain], 
            $secure,
            $httponly);
        // Estabelece o nome fornecido acima como o nome da sessão.
        session_name($session_name);
        ob_start();  
        session_start();            // Inicia a sessão PHP 
        session_regenerate_id();    // Recupera a sessão e deleta a anterior.

        setcookie(session_name(), '', time() + 3600, $params[path], $params[domain], $secure, $httponly);
}

检查是否已登录的功能

function login_check($mysqli) {
    // Verifica se todas as variáveis das sessões foram definidas 
    if (isset($_SESSION[user_id], $_SESSION[username], $_SESSION[login_string])) {

        $user_id = $_SESSION[user_id];
        $login_string = $_SESSION[login_string];
        $username = $_SESSION[username];

        // Pega a string do usuário.
        //$user_browser = $_SERVER[HTTP_USER_AGENT];

        if ($stmt = $mysqli->prepare("SELECT usuarioSenha FROM usuario WHERE usuarioCod = ? LIMIT 1")) {
            // Atribui "$user_id" ao parâmetro. 
            $stmt->bind_param('i', $user_id);
            $stmt->execute();   // Execute the prepared query.
            $stmt->store_result();

            if ($stmt->num_rows == 1) {
                // Caso o usuário exista, pega variáveis a partir do resultado.                 
                $stmt->bind_result($password);
                $stmt->fetch();
                $login_check = $password;//hash('sha512', $password.$user_browser);

                if ($login_check == $login_string) {
                    return true;
                } else {
                    return false;
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    } else {
        return false;
    }
}

登录功能

function login($email, $password, $mysqli) {
    // Usando definições pré-estabelecidas significa que a injeção de SQL (um tipo de ataque) não é possível. 
    if ($stmt = $mysqli->prepare("SELECT usuarioCod, usuarioNome, usuarioSenha
        FROM usuario
            WHERE usuarioEmail = ?
            LIMIT 1")) {
        $stmt->bind_param('s', $email);  // Relaciona  "$nusp" ao parâmetro.
        $stmt->execute();    // Executa a tarefa estabelecida.
        $stmt->store_result();

        // obtém variáveis a partir dos resultados. 
        $stmt->bind_result($user_id, $user_name, $user_senha);
        $stmt->fetch();

        // faz o hash da senha com um salt excusivo.
        //$password = hash('sha512', $password);
        if ($stmt->num_rows == 1) {

            if ($user_senha == $password) {
                $_SESSION[user_id] = $user_id;
                $_SESSION[username] = $user_name;
                $_SESSION[login_string] = $user_senha;//hash('sha512', $password.$user_browser);

                return '';
            }
        } else {
            // Tal usuário não existe.
            return '<p class="error"> Não existe esse usuario </p>';
        }
    }else {
        return '<p class="error"> contate o adiministrador </p>';
    }
}

【问题讨论】:

  • 每一页都有session_start()吗?
  • 是的,我在每个页面上都创建了一个“sec_session_star()”,该函数包含“session_start()”。如果我只尝试 'session_start()' 不起作用也无法登录。
  • 在个人登录功能中,您启动了两次会话,这是为什么呢?
  • 我从哪里开始两次?

标签: php session


【解决方案1】:

我从 my session_start() 中删除了这 3 个函数,自定义为 sec_session_start() resoveu,但我不知道为什么。

ob_start();  
session_regenerate_id();
setcookie(session_name(), '', time() + 3600, $params[path], $params[domain], $secure, $httponly);

【讨论】:

    猜你喜欢
    • 2017-12-28
    • 2017-09-11
    • 2014-01-28
    • 2014-05-27
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多