2012-08-29 6 views
-2

Я использую имя пользователя и пароль из своей базы данных в качестве моей переменной сеанса, но когда я выхожу из системы, я все же могу зайти на защищенную страницу с прямой ссылкой из моего браузера, что может быть причиной этого. Вот мой login.php:Я не могу уничтожить сеанс

//initialize the variables 
      $username=""; 
      $password=""; 
      $_SESSION['username']=""; 
      $_SESSION['password']=""; 
      if(isset($_POST["submit"]) && @$_GET["username"] !==""){ 
       $username=$_POST["username"]; 
       $password=$_POST["password"]; 
       if(isset($_POST["username"]) && $_POST["username"]!=="" && isset($_POST["password"]) && $_POST["password"]!==""){ 
        //sucuring the data 
        $username=htmlentities(mysql_real_escape_string(trim($_POST["username"]))); 
        $password=htmlentities(mysql_real_escape_string(trim($_POST["password"]))); 
        //checking if user does exist 
        $sql="SELECT email, password FROM ".$db_name.".user WHERE email=\"".$username."\" AND password='".md5($password)."' LIMIT 1"; 
        $query=mysql_query($sql,$con); 
        $result=mysql_fetch_assoc($query); 
        //check query to c if is successfully optional 
        if(!$result){ 
         print"No result"; 
        }else{ 
         //if combination found in our database then register session values"; 
         $_SESSION['username']=$_POST['username']; 
         $_SESSION['password']=md5($_POST['password']); 
         //check location 
         $sql="SELECT location FROM ".$db_name.". user WHERE email ='".$_POST['username']."' LIMIT 1"; 
         $query=mysql_query($sql,$con); 
         $result=mysql_fetch_array($query); 
         //no need of loop since we want only one field/single record/row 
         $location=$result['location']; 
         header("Location:".$location.""); 
        } 
       }else{ 
       //do nothing 
       } 

      } 

     ?> 
     <form id="loginFrm" method="post" action="?lgn=getin"> 
      <fieldset> 
       <legend> 
        Inshuz Login 
       </legend> 
       <table> 
        <tr> 
         <td> 
          Username 
          <div id="specify">Your email</div> 
         </td> 
         <td> 
          <input type="text" name="username" size="40" class="text" value="<?php print $username; ?>"> 
         </td> 
        </tr> 
        <tr> 
         <td> 
          Password 
         </td> 
         <td> 
          <input type="password" name="password" size="40" class="text" value="<?php print $password; ?>"> 
         </td> 
        </tr> 
        <tr> 
         <td colspan="2"> 
          <input type="submit" name="submit" class="btn" value="Login"> 
         <td> 
        </tr> 
       </table> 
      </fieldset> 
     </form> 

это login.php входит в мой index.php, ниже которого является домашняя страница

<?php session_start(); require_once("includes/functions/url.php"); require_once("includes/config/config.php");?> 
    <html> 
     <head> 
      <title> 

      </title> 
     <head> 
     <link rel="stylesheet" media="all" type="text/css" href="css/main.css"/> 
     <script type="text/javascript" src="js/jquery-1.8.0.js"></script> 
     <body> 
       <div id="wrapper"> 
        <div id="header"> 
         <div id="nav"> 
          <a href="#">Home </a> | <a href="#">About us</a> | <a href="#">Products</a> | <a href="#">Services</a> | <a href="#">Carrers</a> 
         </div> 
        </div><!--end of header--> 
        <div id="mainContent"> 
        <div id="RighContent"> 
         <?php require_once("includes/pages/"[email protected]$page);?> 
        </div><!---RightCont---> 
        <div id="LeftCont"> 
         afafhkashf 
        </div><!---leftcont---> 
        </div><!---end of maincontent--> 
        <div id="footer"> 

        </div><!--end footer--> 
       </div><!--end of wrapper--> 
     <body> 
    </html> 

Вот моя защищенная страница:

<?php session_start(); 
    require_once("includes/functions/url.php"); 
    if(!isset($_SESSION['username'])){ 
     header("Location: ../"); 
     exit(); 
    } 
?> 
<html> 
    <head> 
     <title> 

     </title> 
    <head> 
    <link rel="stylesheet" media="all" type="text/css" href="css/main.css"/> 
    <script type="text/javascript" src="js/jquery-1.8.0.js"></script> 
    <body> 
      <div id="wrapper"> 
       <div id="header"> 
        <div id="nav"> 
         <a href="#">Home </a> | <a href="#">About us</a> | <a href="#">Products</a> | <a href="#">Services</a> | <a href="#">Carrers</a> 
         <?php 
          //show logout 
          if(isset($_SESSION['username'], $_SESSION['password'])){ 
           print " | <a href=\"includes/pages/logout.php?log=logout\">Logout</a>"; 
          } 
         ?> 
        </div> 
       </div><!--end of header--> 
       <div id="mainContent"> 
       <div id="RighContent"> 
        <h1>Welcome admin: <?php print @$_SESSION['username']; ?></h1> 
       </div><!---RightCont---> 
       <div id="LeftCont"> 
        afafhkashf 
       </div><!---leftcont---> 
       </div><!---end of maincontent--> 
       <div id="footer"> 

       </div><!--end footer--> 
      </div><!--end of wrapper--> 
    <body> 


</html> 

И, наконец, вот моя страница выхода:

 <?php 
      ini_set('session.use_trans_sid', false); 
      session_start(); 
      //require_once("includes/functions/url.php"); 
      if(isset($_GET['log']) && $_GET['log']=="logout"){ 
       if(isset($_SESSION['username'] , $_SESSION['password']) && !empty($_SESSION['username']) && !empty($_SESSION['password'])){ 
        unset($_SESSION['username']); 
        unset($_SESSION['password']); 
        header("Location: ../../"); 
        exit(); 
       } 
      } 
     ?> 
+5

Я не вижу ' session_destroy() 'вызывается *** где угодно *** в вашем коде. – Matt

+3

Кроме того, это может не помочь ответить на ваш вопрос, но вы должны прекратить использовать 'mysql_ *' функции. Они устарели. Вместо этого используйте [PDO] (http://php.net/manual/en/book.pdo.php) (поддерживается с PHP 5.1) или [mysqli] (http://php.net/manual/en/book. mysqli.php) (поддерживается с PHP 4.1). Если вы не знаете, какой из них использовать, [прочитайте эту статью] (http://www.deprecatedphp.com/mysql_/). – Matt

+0

У вас есть логическая деинсталляция '$ _SESSION ['username']' и '$ _SESSION ['passowrd']' (почему вы храните пароли в сеансе ???), но если одно из этих значений пустое, Не бегай. Не проверяйте, не являются ли они пустыми, просто 'unset()' them. –

ответ

2
unset($_SESSION); 
session_destroy(); 

Вы пробовали?

+0

Извините originaly sessin_destroy(); был трэк, я думаю, что я случайно его исключил, когда я вставлял свой код. –

3

Bellow - это то, что вы назвали своей функцией выхода из системы. Просто из-за того, что вы отключили Session[username] and Session[password], это не значит, что вы уничтожили сеанс. Существует функция, называемая session_destroy, которая делает то, что вы хотите. Для получения информации об использовании см. this.

<?php 
       ini_set('session.use_trans_sid', false); 
       session_start(); 
       //require_once("includes/functions/url.php"); 
       if(isset($_GET['log']) && $_GET['log']=="logout"){ 
        if(isset($_SESSION['username'] , $_SESSION['password']) && !empty($_SESSION['username']) && !empty($_SESSION['password'])){ 
         unset($_SESSION['username']); 
         unset($_SESSION['password']); 
         header("Location: ../../"); 
         exit(); 
        } 
       } 
      ?> 
+0

Логика на защищенной странице проверяет, установлено ли '$ _SESSION ['username']'. Если на странице выхода был 'unset()', то эта логика должна работать без 'session_destroy()'. Эти ключи не являются 'unset()' возможно потому, что логика на странице выхода из системы неисправна. –

+0

@MichaelBerkowski Я видел это. Причина, по которой я предложил 'session_destroy', - это то, что это лучше. На странице выхода из системы он отключает имя пользователя и пароль. Если где-либо еще (я не просмотрел весь код), он использует 'SESSION' для хранения чего-либо еще, после чего у него могут возникнуть конфликты позже. 'session_destroy' позаботится обо всем этом, и это намного проще, чем отключить все, что вы установили в своей сессии. –

+0

Не могли бы вы объяснить, почему вы считаете логику логики неисправной (Michael Berkowski), потому что я уверен, что с моим небольшим пониманием, которое должно было работать нормально. Может ли это быть причиной http://www.php.net/manual/en/function.session-destroy.php#85743, но я использую firefox 14 и выше –

0

Наряду со всеми комментариями выше по session_unset() и session_destroy(), вы также можете включить что-то, чтобы очистить кэш в вашем браузере, чтобы предотвратить кто-то с помощью кнопки НАЗАД, или в противном случае перезагрузки страницы.

header('cache-control: no-cache,no-store,must-revalidate'); // HTTP 1.1. 
header('pragma: no-cache'); // HTTP 1.0. 
header('expires: 0'); // Proxies. 
+0

Ребята, я думаю, что Майкл Берковски прав, я изменил мою страницу выхода на ini_set ('session.use_trans_sid', false); \t session_start(); \t //require_once("includes/functions/url.php "); \t if (isset ($ _ GET ['log']) && $ _GET ['log'] == "logout") { \t \t session_destroy(); \t \t header ("Местоположение: ../../"); \t} и его работа так же, как я ожидал, но я не могу объяснить y –

1

Используйте это выход из системы стр

<?php 
session_start(); 
session_destroy(); 
session_unset(); 
header("location:../index.php"); 

?> 

И ниже код для защищенной страницы

if($_SESSION['uid']==true){ 
} 
    }else{ 
     header('Location:../'); 
    } 

Я рекомендую идентификатор пользователя, вместо того, чтобы использовать имя пользователя

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