Contrôle de session login

  • mindfullsilence
  • Professor
  • Professor
  • Avatar de l’utilisateur
  • Inscription: Aoû 04, 2008
  • Messages: 846
  • Status: Offline

Message Mars 23rd, 2012, 4:26 pm

IVe été traitant de ce désordre pour environ une semaine maintenant. Php im prise au Collège ce semestre et ne semble pas prête à découvrir comment obtenir un script de connexion fiable pour travailler. L'objectif du cours est l'infrastructure MVC et l'interaction avec le serveur via PDO.

Jusqu'à présent, j'ai pour mes modèles, les vues et les contrôleurs (nivellement vers le bas pour montrer les bits importants) ce qui suit :

Structure de fichier
  • /app
    • index.php
    • /View
      • admin-panel.php
      • Header.php
      • Footer.php
    • / modèle
      • Database.php
    • /login
      • index.php
      • / modèle
        • User.php
      • /View
        • login.php

Mon /app/index.php :
PHP Code: [ Select ]
session_start();
if (!isset($_SESSION['admin']) || $_SESSION != 1) {
header ("Location: ./login");
}
 
//logged in
include 'view/header.php';
require 'model/database_db.php';
include 'view/panel.php';
require_once 'view/footer.php';
?>
 
  1. session_start();
  2. if (!isset($_SESSION['admin']) || $_SESSION != 1) {
  3. header ("Location: ./login");
  4. }
  5.  
  6. //logged in
  7. include 'view/header.php';
  8. require 'model/database_db.php';
  9. include 'view/panel.php';
  10. require_once 'view/footer.php';
  11. ?>
  12.  


APP/login/index.php
PHP Code: [ Select ]
<?php
 
// if already logged in
session_start();
 
echo $_SESSION['admin'];
//////////////////////////////
// Do loggin stuff         //
//////////////////////////////
// get action
if(isset($_POST['action']))
{
   $action = $_POST['action'];
}
else
{
   $action = 'none';
}
$action = strtolower($action);
require_once '../model/database_db.php';
require_once 'model/user.php';
if(is_object($user)) {
   $user->logout();
   
}
switch($action) {
   case 'none':
      include '../view/header.php';
      include 'view/login.php';
      include '../view/footer.php';
      break;
   case 'login':
      $user = new User();
      $user->set_params($_POST);
      $user->login();
      if($user->has_errors())
      {
         include '../view/header.php';
         include 'view/login.php';
         include '../view/footer.php';
      }
      else {
         include '../view/header.php';
         include '../view/panel.php';
         include '../view/footer.php';
      }
      break;
   case 'logout':
      $user->logout();
      echo 'you logged out';
      header('Location: ./');
      break;
}
?>
 
  1. <?php
  2.  
  3. // if already logged in
  4. session_start();
  5.  
  6. echo $_SESSION['admin'];
  7. //////////////////////////////
  8. // Do loggin stuff         //
  9. //////////////////////////////
  10. // get action
  11. if(isset($_POST['action']))
  12. {
  13.    $action = $_POST['action'];
  14. }
  15. else
  16. {
  17.    $action = 'none';
  18. }
  19. $action = strtolower($action);
  20. require_once '../model/database_db.php';
  21. require_once 'model/user.php';
  22. if(is_object($user)) {
  23.    $user->logout();
  24.    
  25. }
  26. switch($action) {
  27.    case 'none':
  28.       include '../view/header.php';
  29.       include 'view/login.php';
  30.       include '../view/footer.php';
  31.       break;
  32.    case 'login':
  33.       $user = new User();
  34.       $user->set_params($_POST);
  35.       $user->login();
  36.       if($user->has_errors())
  37.       {
  38.          include '../view/header.php';
  39.          include 'view/login.php';
  40.          include '../view/footer.php';
  41.       }
  42.       else {
  43.          include '../view/header.php';
  44.          include '../view/panel.php';
  45.          include '../view/footer.php';
  46.       }
  47.       break;
  48.    case 'logout':
  49.       $user->logout();
  50.       echo 'you logged out';
  51.       header('Location: ./');
  52.       break;
  53. }
  54. ?>
  55.  


APP/login/model/user.php
PHP Code: [ Select ]
<?php
class User {
   public $error = array();
   private $un;
   private $pass;
   public function __construct() {}
   
   public function set_params($login_info) {
     
      if(count($login_info) > 3) {
         session_destroy();
         $_SESSION = array();
         login_error('Too many inputs, are you a bot?');
      }
     
      else {
         $this->un = $login_info['username'];
         $this->pass = $login_info['password'];
      }
     
   }
   
   private function login_error($message) {
      array_push($this->error,$message);
   }
   
   public function has_errors() {
      $er;
      if($this->error > 0) {
         foreach($this->error as $m) {
            $er .= '<span>' . $m . '</span>';
         }
         return $er;
      }
      else {
         return false;
      }
   }
   
   
   public function login() {
      $db = Database::getDB();
      $q = "SELECT * from admin where ad_username='$this->un' AND ad_password='$this->pass'";
      $query = $db->query($q);
      if($query->fetch() > 0) {
         $_SESSION['admin'] = 1;
         session_start();
      }
      else {
         $this->login_error('Your username or password was incorrect');
      }
   }
   
   public function logout() {
      $_SESSION = array();
      session_destroy();
   }
}
 
?>
 
  1. <?php
  2. class User {
  3.    public $error = array();
  4.    private $un;
  5.    private $pass;
  6.    public function __construct() {}
  7.    
  8.    public function set_params($login_info) {
  9.      
  10.       if(count($login_info) > 3) {
  11.          session_destroy();
  12.          $_SESSION = array();
  13.          login_error('Too many inputs, are you a bot?');
  14.       }
  15.      
  16.       else {
  17.          $this->un = $login_info['username'];
  18.          $this->pass = $login_info['password'];
  19.       }
  20.      
  21.    }
  22.    
  23.    private function login_error($message) {
  24.       array_push($this->error,$message);
  25.    }
  26.    
  27.    public function has_errors() {
  28.       $er;
  29.       if($this->error > 0) {
  30.          foreach($this->error as $m) {
  31.             $er .= '<span>' . $m . '</span>';
  32.          }
  33.          return $er;
  34.       }
  35.       else {
  36.          return false;
  37.       }
  38.    }
  39.    
  40.    
  41.    public function login() {
  42.       $db = Database::getDB();
  43.       $q = "SELECT * from admin where ad_username='$this->un' AND ad_password='$this->pass'";
  44.       $query = $db->query($q);
  45.       if($query->fetch() > 0) {
  46.          $_SESSION['admin'] = 1;
  47.          session_start();
  48.       }
  49.       else {
  50.          $this->login_error('Your username or password was incorrect');
  51.       }
  52.    }
  53.    
  54.    public function logout() {
  55.       $_SESSION = array();
  56.       session_destroy();
  57.    }
  58. }
  59.  
  60. ?>
  61.  

APP/login/View/login.php
PHP Code: [ Select ]
<div id="login">
<h1>Please Login</h1>
<?php
if(is_object($user) && $user->has_errors())
echo '<div class="error">' . $user->has_errors() . '</div>';
?>
<form method="post" action=".">
<input type="text" name="username">
<input type="password" name="password">
<input type="hidden" name="action" value="login" />
<button type="submit">Login</button>
</form>
</div>
 
  1. <div id="login">
  2. <h1>Please Login</h1>
  3. <?php
  4. if(is_object($user) && $user->has_errors())
  5. echo '<div class="error">' . $user->has_errors() . '</div>';
  6. ?>
  7. <form method="post" action=".">
  8. <input type="text" name="username">
  9. <input type="password" name="password">
  10. <input type="hidden" name="action" value="login" />
  11. <button type="submit">Login</button>
  12. </form>
  13. </div>
  14.  


Lorsque je clique sur connexion avec un mauvais nom d'utilisateur ou mot de passe, je suis redirigé vers la page de connexion et affiche l'erreur. C'est bien.

Lorsque je clique sur connexion avec un bon nom d'utilisateur et un mot de passe, je suis dirigé vers le « app/index.php ». Aussi bonne

Je suis incapable de vous déconnecter. Lorsque je clique sur mon bouton « logout » Ive installées dans mon en-tête, le $_SESSION ["admin"] n'est pas détruite.
Aussi, si je détruire la session et puis tapez l'emplacement de mon lieu de « app/index.php » dans le navigateur, je suis capable de faire le panneau admin même si je ne suis pas connecté.

J'ai couru la fonction « Déconnexion » sur mon objet d'utilisateur $ (instanciation de la classe utilisateur dans « app/login/model/user.php ») pour effacer mes variables de $_SESSION et ensuite tenté d'écho de $_SESSION ["admin"]. Im getting « 1 » qui me dit de que variables $_SESSION ne sont pas se nettoyés, qui Im deviner quoi je peux trouver la page admin sans journalisation dans.
Use your words like arrows to shoot toward your goal.
  • Anonymous
  • Bot
  • No Avatar
  • Inscription: 25 Feb 2008
  • Messages: ?
  • Loc: Ozzuland
  • Status: Online

Message Mars 23rd, 2012, 4:26 pm

  • natas
  • PHP Ninja
  • Proficient
  • No Avatar
  • Inscription: Mar 28, 2009
  • Messages: 305
  • Loc: AFK
  • Status: Offline

Message Mars 24th, 2012, 9:11 pm

Dans votre "/ app/index.php" sur la ligne 2, à quoi

Code: [ Select ]
$_SESSION != 1


effectivement vérifier ?

IVe jamais utilisé qu'avant et juste curieux.
Custom Web Design
  • natas
  • PHP Ninja
  • Proficient
  • No Avatar
  • Inscription: Mar 28, 2009
  • Messages: 305
  • Loc: AFK
  • Status: Offline

Message Mars 24th, 2012, 9:14 pm

Avez-vous essayé à l'aide de

unset($_SESSION["admin"]) ;

EDIT :

ou

session_unset() ;
Custom Web Design
  • mindfullsilence
  • Professor
  • Professor
  • Avatar de l’utilisateur
  • Inscription: Aoû 04, 2008
  • Messages: 846
  • Status: Offline

Message Mars 29th, 2012, 1:26 am

Hey guys, I got it fonctionne si j'ai pensé partager Id. Était assez simple vraiment, que si vous prenez un coup d'oeil à mon script de « app/login/view/login.php » à la fin, vous remarquerez que theere est une fonction de déconnexion. Eh bien, ce ne pas un tas de bonnes lorsque l'appelant sur un objet, si Im sur une séparée de la page qui n'a pas instancié l'objet encore. Fondamentalement, je n'avais partagé l'objet à travers mes scripts comme global, que donc après être redirigé vers la page d'admin une fois connecté, l'objet utilisateur de $ a été détruit. Donc quand j'ai cliqué sur Déconnexion, j'a été prise de ma page de connexion et essayé d'appeler la fonction « Déconnexion » sur un objet qui n'existe plus. J'ai fini par coller juste « unset($_SESSION["admin"]) à l'intérieur de mon contrôleur de connexion au lieu d'à l'intérieur de la classe. Espoir qui fait sens, si pas et que la personne a besoin pour mieux comprendre, faites le moi savoir et mal poste un code.
Use your words like arrows to shoot toward your goal.
  • this213
  • Guru
  • Guru
  • Avatar de l’utilisateur
  • Inscription: Mar 01, 2004
  • Messages: 1242
  • Loc: ./
  • Status: Offline

Message Mars 30th, 2012, 9:39 am

Glad you got it fixe, cependant....

Vous devriez seulement employer PHP construit en sessions comme une solution temporaire. Toute personne ayant accès au serveur peut bien faire ce qu'ils veulent avec eux, y compris modifier leur emplacement ou leur lecture pure et simple. Cela va de quadruple pour toute personne écrivant du code sur un hébergement mutualisé avec plusieurs sites web.

Une bien meilleure solution est de simplement générer une chaîne aléatoire et le définir comme un cookie ainsi que stocker dans votre base de données avec divers info client tels que l'agent utilisateur, timestamp et ainsi de suite. Vous pouvez ensuite faire un second tableau pour stocker les variables de session que vous pourriez, qui peuvent inclure l'id d'utilisateur, les paramètres de l'option et ainsi de suite. Lorsque vous détruisez une séance comme ça, vous définissez le cookie à une valeur de non-sens et supprimez les lignes de ces tableaux reliés à cette chaîne aléatoire et il n'existe aucun moyen possible qu'un utilisateur pourrait encore être connecté. Cela vous donne beaucoup plus de contrôle à authentifier une session parce que maintenant vous pouvez faire des choses comme s'assurer que l'utilisateur est encore en utilisant le même navigateur à qu'ils connectés, ou assurer qu'un utilisateur est connecté uniquement d'un endroit.
  • mindfullsilence
  • Professor
  • Professor
  • Avatar de l’utilisateur
  • Inscription: Aoû 04, 2008
  • Messages: 846
  • Status: Offline

Message Mars 30th, 2012, 9:40 pm

Hein, j'aurais jamais pensé cela. Je pourrais revenir sur ce fil plus tard sur la route de demander comment implémenter une telle méthode. Pour l'instant, c'est un projet d'école simple donc je ne pense pas qu'il faut s'inquiéter trop sur la sécurité pour l'instant. J'ont une compréhension très faible de PHP dès maintenant mais je me fais lentement- et Im encore lightyears d'avance le reste de ma classe donc je doute mon instructeur ira trop profondément dans les questions de sécurité. Il a fait pas même crypter les mots de passe pour la base de données parce que l'idée de la conversion d'une valeur de forme à un amas de caractères était trop grande pour la classe de comprendre. L'incapacité des élèves à comprendre le comment ni le pourquoi stupéfié me. Point est mal sûr Im ont encore une quantité incroyable de matériel pour apprendre postdiplôme.
Use your words like arrows to shoot toward your goal.

Afficher de l'information

  • Total des messages de ce sujet: 6 messages
  • Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 154 invités
  • Vous ne pouvez pas poster de nouveaux sujets
  • Vous ne pouvez pas répondre aux sujets
  • Vous ne pouvez pas éditer vos messages
  • Vous ne pouvez pas supprimer vos messages
  • Vous ne pouvez pas joindre des fichiers
 
 

© 2011 Unmelted, LLC. Ozzu® est une marque déposée de Unmelted, LLC