2013-03-23 3 views
0

Я передаю пользовательскую переменную через сеансы. Он отлично работает на локальном хосте, но один раз на веб-сервере он делает странные вещи.Проблемы с сеансами PHP в разных средах

После входа в систему переменная сеанса работает так же, как и до тех пор, пока вы не нажмете на три страницы, и она внезапно перейдет в POOF!

Обратите внимание на «Welcome, jordan.» в отличие от «Welcome, .» Также в верхнем левом углу. функционирование

Сессия: http://imageshack.us/photo/my-images/32/loggedins.png/

Session пуф! http://imageshack.us/photo/my-images/515/loggedinno.png/

Войти/Создать сеансовый код переменной:

<?php 
     include_once 'gtheader.php'; 
     if (!isset($_SESSION['user'])) 
     { 
     if (isset($_POST['user'])) 
     { 
     $user = sanitizeString($_POST['user']); 
     $pass = sanitizeString($_POST['pass']); 
     if (preg_match($txtMatch,$user)) 
     { 
     if ($user == "" || $pass == "") 
     { 
     $error = "Please enter all required fields"; 
     } 
     else 
     { 
     $query = "SELECT * FROM gtmembers WHERE user='$user'"; 
     $result = queryMysql($query); 
     $rank = mysql_result($result, 0, 'rank'); 
     if (!mysql_num_rows($result)) 
     { 
     $error = "Username does not exist."; 
     } 
     else 
     { 
     $getPass = mysql_result($result, 0, 'pass'); 
     $salt = substr($getPass, 0, 64); 
     $hash = $salt . $pass; 
     for ($i = 0; $i < 100000; $i++) 
     { 
     $hash = hash('sha256', $hash); 
     } 
     $hash = $salt . $hash; 
     if ($hash == $getPass) 
     { 
     if ($rank != "Banned") 
     { 
     $userLow = strtolower($user); 
     $_SESSION['user'] = $userLow; 
     $_SESSION['rank'] = $rank; 
     echo <<<_END 
     <script type="text/javascript"> 
     window.location.href='index.php'; 
     </script> 
     _END; 
     echo "Successfully logged in. Click <a href='index.php'>here</a> to continue."; 
     } 

Заголовок Код:

 <?php //gtheader.php 
     session_start(); 
     include_once 'gtfunctions.php'; 
     $loggedIn = FALSE; 

     if (isset($_SESSION['user'])) 
     { 
     $user = $_SESSION['user']; 
     if ($user) echo "Current User: $user<br />"; 
     else echo "Current User: None<br />"; 
     $rank = $_SESSION['rank']; 
     $loggedIn = TRUE; 
     echo "is set SESSION['user']? Yes"; 
     } 
     else echo "is set SESSION['user']? No"; 

     echo "<div id='header'><a class='header' href='index.php'> <h1 id='headerTitle'>$appname</h1></a>"; 
     if ($loggedIn == TRUE) 
     { 
     $query = "SELECT * FROM gtmessages WHERE recip='$user' AND status='0'"; 
     $result = queryMysql($query); 
     if (mysql_num_rows($result) == 0) $num = ""; 
     else $num = "[".mysql_num_rows($result)."]"; 
     if ($rank == 'Owner' || $rank == 'Admin') 
     { 
     echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a  class='header' href='gtmessage.php'>$num</a>. [<a class='header'  href='gtlogout.php'>Logout</a>] | <a class='header' href='gtadmin.php'>Admin</a><br />"; 
     } 
     else 
     { 
     echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a  class='header' href='gtmessage.php'>$num</a>. [<a class='header'  href='gtlogout.php'>Logout</a>]<br />"; 
     } 
     } 
?> 
+0

Есть ли шанс, что это может быть hostgator? Этот код работал с 1 и 1 – user2058050

+1

в сеансе проверки заголовка файла print_r ($ _ SESSION), поэтому вы можете видеть, что все значения приближаются или нет. – Napster

+0

Какова версия php на вашем компьютере и на другом сервере? –

ответ

1

Исеть() возвращает истину для массива, даже если массив пуст.

Вместо этого вы должны использовать ! Empty().

Обновление Также убедитесь, что серверы настроены так, чтобы хранить переменные.

Update 2

<?php 
      error_reporting(E_ALL); 
      ini_set("display_errors", 1); 
    include_once 'gtheader.php'; 
    if (empty($_SESSION['user'])){ 
     if (!empty($_POST['user'])){ 
      $user = sanitizeString($_POST['user']); 
      $pass = sanitizeString($_POST['pass']); 
      if (preg_match($txtMatch,$user)){ 
       if (empty($user) || empty($pass)){ 
        $error = "Please enter all required fields"; 
       }else{ 
        $query = "SELECT * FROM gtmembers WHERE user='".mysql_real_escape_string($user)."'"; 
        $result = queryMysql($query); 
        $rank = mysql_result($result, 0, 'rank'); 
       } 
      } 
      if (!mysql_num_rows($result)){ 
       $error = "Username does not exist."; 
      }else{ 
       $getPass = mysql_result($result, 0, 'pass'); 
       $salt = substr($getPass, 0, 64); 
       $hash = $salt . $pass; 
       for ($i = 0; $i < 100000; $i++){ 
        $hash = hash('sha256', $hash); 
       } 
       $hash = $salt . $hash; 
       if ($hash == $getPass){ 
        if ($rank !== "Banned"){ 
         $userLow = strtolower($user); 
         $_SESSION['user'] = $userLow; 
         $_SESSION['rank'] = $rank; 
         echo "<script type=\"text/javascript\">window.location.href='index.php';</script>"; 
         echo "Successfully logged in. Click <a href='index.php'>here</a> to continue."; 
        } 
       } 
      } 
     } 
    } 
    ?> 

gtheader.php

<?php //gtheader.php 
    session_start(); 
      error_reporting(E_ALL); 
      ini_set("display_errors", 1); 

      include_once 'gtfunctions.php'; 
      $loggedIn = FALSE; 

      if(session_id() == "") 
      { session_start(); } 

      if(empty($_REQUEST['PHPSESSID'])){ 
       $session_id = session_id(); 
      } else { 
       $session_id = $_REQUEST['PHPSESSID']; 
      } 

      if (!empty($_SESSION['user'])){ 

       //This is not safe at all. Someone could change the user to % 
       $user = $_SESSION['user']; 

        echo "Current User: $user<br />"; 
       //This is not safe either. Someone could change their rank to Admin. 
       $rank = $_SESSION['rank']; 

       $loggedIn = TRUE; 
       echo "is set SESSION['user']? Yes"; 
      } else { 
      $user = ''; 
      $rank = ''; 
      echo "is set SESSION['user']? No"; 
      } 

      echo "<div id='header'><a class='header' href='index.php'> <h1 id='headerTitle'>$appname</h1></a>"; 
      if ($loggedIn == TRUE){ 
      //without filtering, someone could set the user to % which would return everyone from the DB.  
      $query = "SELECT * FROM gtmessages WHERE recip='".mysql_real_escape_string($user)."' AND status='0'"; 
      //This is not a standard function so we're assuming it's set in gtfunctions.php 
      $result = queryMysql($query); 
      //Here you're only checking if this is set, not how many 
      if (empty(mysql_num_rows($result))){ 
       $num = "";} else { 
        //If they trick your SQL statement into returning more than one... 
        $num = "[".mysql_num_rows($result)."]"; 
       } 
      if ($rank == 'Owner' || $rank == 'Admin') 
      { 
      echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a class='header' href='gtmessage.php'>$num</a>. [<a class='header' href='gtlogout.php'>Logout</a>] | <a class='header' href='gtadmin.php'>Admin</a><br />"; 
      } else { 
      echo "Welcome, <a class='header' href='gtmembers.php?view=$user'>$user</a><a  class='header' href='gtmessage.php'>$num</a>. [<a class='header'  href='gtlogout.php'>Logout</a>]<br />"; 
      } 
     } 
    ?> 

Вы хотите использовать что-то вроде Firebug в Firefox для того, чтобы проверить заголовки и посмотреть, если он проходит печенье к вы для сеанса или если сеансы хранятся только на сервере. Также, если сеансы передаются через переменные GET.

Существует много слепого доверия к предоставленной пользователем информации (например, сеансы). Кто-то может захватить сеанс или обмануть более высокое имя пользователя или ранг. В коде отсутствует проверка, правильно ли установлен ранг пользователя.

Я очистил немного SQL-файла под галстуком. Опять слепые доверяют тому, что материал передается прямо на SQL. Если пользователь SQL, выполняющий запрос, имеет доступ на запись к таблицам, тогда у вас может быть возможность для инъекционной атаки.

+0

Даже при том, что это не объясняет, почему массив сеансов продолжает опорожняться. – user2058050

Смежные вопросы