2010-10-16 4 views
1

Il s'agit d'une procédure pas à pas expliquant comment connecter un utilisateur à prestashop sans passer par l'écran de connexion. Ceci est utile si vous ne voulez pas que l'utilisateur se connecte à nouveau, comme lorsque vous souhaitez transférer sa session d'un site Web vers prestashop.Noob façon de se connecter à l'utilisateur dans Prestashop

Étape 1 Éliminez le besoin d'un mot de passe de salage. Sous config/settings.inc.php, définissez _COOKIE_KEY_ sur vide. Notez que cela signifie également que vous devez créer un nouveau client. Ou vous pouvez supprimer l'ancien mot de passe md5 de DB et ajouter le vôtre.

Étape 2 Dans le fichier authentication.php coller les lignes suivantes après la ligne 6:

    $customer = new Customer(); 
        //$authentication = $customer->getByEmail(trim($email), trim($passwd)); 
        $authentication = $customer->getByMd5(trim($email), trim($passwd)); //modified version of getByEmail if we are not accepting $passwd in cleartext but in md5. 
        /* Handle brute force attacks */ 
        sleep(1); 
        if (!$authentication OR !$customer->id) 
         $errors[] = Tools::displayError('authentication failed'); 
        else 
        { 
         $cookie->id_customer = intval($customer->id); 
         $cookie->customer_lastname = $customer->lastname; 
         $cookie->customer_firstname = $customer->firstname; 
         $cookie->logged = 1; 
         $cookie->passwd = $customer->passwd; 
         $cookie->email = $customer->email; 
         if (Configuration::get('PS_CART_FOLLOWING') AND (empty($cookie->id_cart) OR Cart::getNbProducts($cookie->id_cart) == 0)) 
          $cookie->id_cart = intval(Cart::lastNoneOrderedCart(intval($customer->id))); 
         Module::hookExec('authentication'); 
         if ($back = Tools::getValue('back')) 
          Tools::redirect($back); 
         //Tools::redirect('my-account.php'); //cut redirection to break infinite loop 
        } 

Le code ci-dessus est ce qui fait la connexion de l'utilisateur en utilisant $ email comme nom d'utilisateur et $ passwd comme mot de passe en texte clair. Le code d'origine provient de la fonction if (Tools::isSubmit('SubmitLogin')) dans le fichier authentication.php.

Étape 3 Collez le code ci-dessus dans le fichier products.php juste sous la ligne 5

Étape 4 Si vous envoyez $ passwd directement au format md5, voici la version modifiée de (client getByEmail(). php):

public function getByMd5($email, $passwd = NULL) 
    {  
     $result = Db::getInstance()->GetRow('SELECT * FROM `'._DB_PREFIX_ .'customer` WHERE `active` = 1 AND `email` = \''.pSQL($email).'\' '.(isset($passwd) ? 'AND `passwd` = \''.pSQL(_COOKIE_KEY_.$passwd).'\'' : '').' AND `deleted` = 0'); 

     if (!$result) 
      return false; 
     $this->id = $result['id_customer']; 
     foreach ($result AS $key => $value) 
      if (key_exists($key, $this)) 
       $this->{$key} = $value; 

     return $this;  
    } 

Vous pouvez avoir accès au nom d'utilisateur/passwd soit par la fonction $ _COOKIE [] ou par $ _GET []. De toute façon c'est un gros risque de sécurité. La lecture des cookies peut être placée dans le fichier index.php.

Répondre

2

Cette approche que vous avez proposée est extrêmement précaire. Un sel est requis pour la sécurité du mot de passe et ne doit jamais être supprimé. En outre, en authentifiant un utilisateur avec son hachage MD5, vous annulez efficacement toute la protection que vous fournit le mot de passe de hachage. Les gens hachent les mots de passe parce que les attaques comme l'injection SQL permettent à un attaquant d'obtenir ce hachage qui doit ensuite être craqué. Dans ce scénario, l'attaquant peut récupérer le hachage de l'administrateur et se connecter immédiatement.

La bonne façon de faire le partage de session:

Créer une simple table pour stocker l'état de session. Dans ce cas, le Cryptgoraphic Nonce est une grande valeur aléatoire utilisée pour référencer les données.

'insert into session_state (sess,token) value ('.pSQL(serialize($_SESSION)).', '.$cryptographic_nonce.')'

Lorsque le navigateur est redirigé vers une autre boutique leur donner un redirect comme ceci:

header('location: https://some _other_shop/landing.php?token=$cryptographic_nonce');

Lorsque le nouveau serveur reçoit cette demande d'atterrissage, il va chercher l'état de session du serveur précédent :

$sess=http_get($_SERVER['HTTP_REFERER']."?token=$_GET[token]"); $_SESSION=unserialize($sess);

Notez que vous devrez peut-être également transférer les données de l'utilisateur dans la base de données.