Requète préparée avec PDO
Résolu
labourette
Messages postés
657
Date d'inscription
Statut
Membre
Dernière intervention
-
labourette Messages postés 657 Date d'inscription Statut Membre Dernière intervention -
labourette Messages postés 657 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je souhaiterai convertir enfin je veux dire passer mes requètes traditionnelles en requète préparée avec PDO
Je n'arrive pas à mettre en place cette fonction, si quelqu'un pourrais me donner quelques petites explications.
Cette fonction marche bien avec ma connexion actuelle Mysql mais je vais changer la requète de connexion et passer en requète préparée avec PDO
Merci de votre gentillesse.
Je souhaiterai convertir enfin je veux dire passer mes requètes traditionnelles en requète préparée avec PDO
Je n'arrive pas à mettre en place cette fonction, si quelqu'un pourrais me donner quelques petites explications.
Cette fonction marche bien avec ma connexion actuelle Mysql mais je vais changer la requète de connexion et passer en requète préparée avec PDO
Merci de votre gentillesse.
<?php function user_exists($username) { $username = filtres($username); return (mysql_result(mysql_query("SELECT COUNT(id_adherent) FROM tb_adherent WHERE username = '$username'"), 0) == 1) ? true : false; } ?>
A voir également:
- Requête préparée php mysql pdo
- Easy php - Télécharger - Divers Web & Internet
- Mysql community server - Télécharger - Bases de données
- Expert php pinterest - Télécharger - Langages
- Alert php ✓ - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
37 réponses
Bonjour
Je me permet de revenir vers toi.
En fait dans la class Security je n'arrive pas à mettre en place la méthode crypt et decrypt c'est quelque chose d'un peu compliqué pour moi, j'ai essayé re essayé mais en vain.
Merci en tout cas si tu peux encore m'aider à résoudre ce problème.
Merci
Je me permet de revenir vers toi.
En fait dans la class Security je n'arrive pas à mettre en place la méthode crypt et decrypt c'est quelque chose d'un peu compliqué pour moi, j'ai essayé re essayé mais en vain.
Merci en tout cas si tu peux encore m'aider à résoudre ce problème.
Merci
Bonjour
C'étais bien ce que j'ai fait mais l'erreur est
Notice: Undefined index: id_adherent in C
et
Fatal error: Call to a member function getUsername() on a non-object in C
je suis certain que ça va être une connerie de ma part excuse moi.
Merci
C'étais bien ce que j'ai fait mais l'erreur est
Notice: Undefined index: id_adherent in C
et
Fatal error: Call to a member function getUsername() on a non-object in C
je suis certain que ça va être une connerie de ma part excuse moi.
Merci
Qu'est ce qui te dit que l'erreur provient de la classe Security ?
Pour la première erreur (Undefined index) : On dirais que tu mélanges entre les deux nominations $_SESSION['id_adherent'] et $_SESSION['adherent'], utilises soit l'un soit l'autre !
Je pense que la deuxième erreur est dépendante de la première.
Pour la première erreur (Undefined index) : On dirais que tu mélanges entre les deux nominations $_SESSION['id_adherent'] et $_SESSION['adherent'], utilises soit l'un soit l'autre !
Je pense que la deuxième erreur est dépendante de la première.
Bonjour
impossible de voir mon erreur, en fait j'arrive à me connecter avec ce script...
Mais avec celui-ci impossible, pour la création de COOKIE
Si tu peux y jeter un oeil s'il te plait.
Je te remercie
impossible de voir mon erreur, en fait j'arrive à me connecter avec ce script...
if(!empty($_POST)) { $username = Security::clean($_POST['login']); $password = Security::clean($_POST['password']); if(empty($username) || empty($password)) { $error = 'Veuillez entrer le Login et le Mot de passe'; } else { $password = Security::hash($password); $user = new User(); $user->setUsername($username); $user->setPassword($password); if($user->login()) { $_SESSION['id_adherent'] = serialize($user); header('Location: index.php?body=compte_profil&type=compte'); exit(); } else { $error = 'La combinaison Login/Mot de passe est incorrect'; } } } echo isset($error) ? $error . '<br>' : ''
Mais avec celui-ci impossible, pour la création de COOKIE
if(isset($_POST['remember'])) { $user = unserialize($_SESSION['id_adherent']); $value = Security::crypt($user->getUsername()) . '_' . crypt($user->getPassword()); setcookie('moncookie', $value, time() + 3600 * 24 * 3); } elseif(isset($_COOKIE['moncookie'])) { $values = trim($_COOKIE['moncookie']); $values = explode('_', $values); if(count(values) == 2) { $username = Security::decrypt($values[0]); $password = Security::decrypt($values[1]); $user_try = new User(); $user_try->setUsername($username); $user_try->setPassword($password); if($user_try->login()) { $_SESSION['id_adherent'] = serialize($user_try); header('Location: index.php'); exit(); } else { $error = 'La combinaison Login/Mot de passe est incorrect'; } } else { $error = 'Le Cookie est invalide'; } } echo isset($error) ? $error . '<br>' : ''
Si tu peux y jeter un oeil s'il te plait.
Je te remercie
Le cookie, tu le crée seulement si la connexion a réussi !
La session, tu la crée soit via le cookie si celui-ci existe et seulement si la session n'existe pas déjà.
Donc si tu possèdes une page qui est incluse au début de chaque page du site, comme par exemple config.php ou autre, alors ajoutes y la connexion automatique.
Il faut penser à remplacer le mot de passe de l'utilisateur que tu insères dans le cookie par autre chose !
Je l'ai mis juste a titre d'exemple, mais même si celui-ci est crypté, il faut éviter d'héberger du contenu privé coté client.
Donc tu peux ajouter un deuxième mot de passe dans la table utilisateur.
Ce deuxième mot de passe contient un hash aléatoire.
Et à chaque fois que l'utilisateur se connecte VIA le cookie, alors tu mets à jour ce deuxième mot de passe.
Comme ça, même si un hacker arrive à décrypter le contenu du cookie, il ne pourra usurper l'identité de la victime que durant une session.
Mettez en résolu quand c'est résolu ...
if(!empty($_POST)) { $username = Security::clean($_POST['login']); $password = Security::clean($_POST['password']); if(empty($username) || empty($password)) { $error = 'Veuillez entrer le Login et le Mot de passe'; } else { $password = Security::hash($password); $user = new User(); $user->setUsername($username); $user->setPassword($password); if($user->login()) { $_SESSION['id_adherent'] = serialize($user); if(isset($_POST['remember'])) { $value = Security::crypt($user->getUsername()) . '_' . Security::crypt($user->getPassword()); setcookie('moncookie', $value, time() + 3600 * 24 * 3); } header('Location: index.php?body=compte_profil&type=compte'); exit(); } else { $error = 'La combinaison Login/Mot de passe est incorrect'; } } } echo isset($error) ? $error . '<br>' : '';
La session, tu la crée soit via le cookie si celui-ci existe et seulement si la session n'existe pas déjà.
Donc si tu possèdes une page qui est incluse au début de chaque page du site, comme par exemple config.php ou autre, alors ajoutes y la connexion automatique.
if(!isset($_SESSION['id_adherent']) && isset($_COOKIE['moncookie'])) { $values = Security::clean($_COOKIE['moncookie']); $values = explode('_', $values); if(count(values) == 2) { $username = Security::decrypt($values[0]); $password = Security::decrypt($values[1]); $user_try = new User(); $user_try->setUsername($username); $user_try->setPassword($password); if($user_try->login()) { $_SESSION['id_adherent'] = serialize($user_try); header('Location: index.php'); exit(); } else { // A mettre dans le fichier log $error = 'La combinaison Login/Mot de passe est incorrect'; } } else { // A mettre dans le fichier log $error = 'Le Cookie est invalide'; } }
Il faut penser à remplacer le mot de passe de l'utilisateur que tu insères dans le cookie par autre chose !
Je l'ai mis juste a titre d'exemple, mais même si celui-ci est crypté, il faut éviter d'héberger du contenu privé coté client.
Donc tu peux ajouter un deuxième mot de passe dans la table utilisateur.
Ce deuxième mot de passe contient un hash aléatoire.
Et à chaque fois que l'utilisateur se connecte VIA le cookie, alors tu mets à jour ce deuxième mot de passe.
Comme ça, même si un hacker arrive à décrypter le contenu du cookie, il ne pourra usurper l'identité de la victime que durant une session.
Mettez en résolu quand c'est résolu ...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour
Apres avoir quitté mon navigateur pour voir si le COOKIE fonctionne lorsque j'ouvre de nouveau mon navigateur ça me retourne cette erreur...
ça correspond à cette ligne
la connexion auto je l'ai mis dans ma page index.php
Sinon merci ça m'a beaucoup aidé à comprendre pour moi c'est tout nouveau mais c'est génial.
Une question pourquoi tu a mis simplement que 2 ligne en commentaire ?
// A mettre dans le fichier log
Apres avoir quitté mon navigateur pour voir si le COOKIE fonctionne lorsque j'ouvre de nouveau mon navigateur ça me retourne cette erreur...
Notice: Use of undefined constant values - assumed 'values' in
ça correspond à cette ligne
if(count(values) == 2) {
la connexion auto je l'ai mis dans ma page index.php
Sinon merci ça m'a beaucoup aidé à comprendre pour moi c'est tout nouveau mais c'est génial.
Une question pourquoi tu a mis simplement que 2 ligne en commentaire ?
// A mettre dans le fichier log
C'est $values et non pas values !
J'ai mis ce commentaire parce que j'ai jugé inutile d'afficher à l'utilisateur que les données du cookie sont invalides.
Parce que si tu réfléchis bien, il n'y a aucune raison pour que les données soient invalide, SAUF si l'utilisateur a essayé (je ne sais pour quelle raison) de modifier manuellement le contenu du cookie (surement pour tenter de décrypter le contenu du cookie afin de voler la session d'un autre membre), donc au lieu de lui afficher un message "Cookie invalide", on insère plutôt l'information dans un fichier log avec quelque informations supplémentaires (IP, date ...), et si l'IP est statique dans le pays de cet utilisateur, alors tu pourras savoir qui ou combien d'utilisateurs sont "hostiles" envers ton service web.
J'ai mis ce commentaire parce que j'ai jugé inutile d'afficher à l'utilisateur que les données du cookie sont invalides.
Parce que si tu réfléchis bien, il n'y a aucune raison pour que les données soient invalide, SAUF si l'utilisateur a essayé (je ne sais pour quelle raison) de modifier manuellement le contenu du cookie (surement pour tenter de décrypter le contenu du cookie afin de voler la session d'un autre membre), donc au lieu de lui afficher un message "Cookie invalide", on insère plutôt l'information dans un fichier log avec quelque informations supplémentaires (IP, date ...), et si l'IP est statique dans le pays de cet utilisateur, alors tu pourras savoir qui ou combien d'utilisateurs sont "hostiles" envers ton service web.
Bonjour,
En ce qui concerne la connexion et la création du COOKIE ça fonctionne correctement, mais pour la connexion automatique lorsque j'ouvre mon navigateur je suis obligé de me reconnecter.
Encore un coup de main pour finaliser ma connexion s'il te plait et ce sera vraiment génial.
Merci en tout cas.
En ce qui concerne la connexion et la création du COOKIE ça fonctionne correctement, mais pour la connexion automatique lorsque j'ouvre mon navigateur je suis obligé de me reconnecter.
Encore un coup de main pour finaliser ma connexion s'il te plait et ce sera vraiment génial.
Merci en tout cas.
Bonjour
J'ai aucun retour de message d'erreur, je me connecte le COOKIE est créé Lorsque je réouvre mon navigateur je suis sur la page d'accueil de mon site et avec mon formulaire pour me reconnecter c'est tout en fait
Merci
J'ai aucun retour de message d'erreur, je me connecte le COOKIE est créé Lorsque je réouvre mon navigateur je suis sur la page d'accueil de mon site et avec mon formulaire pour me reconnecter c'est tout en fait
Merci
Alors faut tester, débuger ...
Regarde ce que ça affiche.
if(!isset($_SESSION['id_adherent']) && isset($_COOKIE['moncookie'])) { echo '<br>Session No, Cookie Yes<br>'; $values = Security::clean($_COOKIE['moncookie']); $values = explode('_', $values); if(count($values) == 2) { $username = Security::decrypt($values[0]); $password = Security::decrypt($values[1]); echo '<br>Cookie Username : ' . $username . ', Password : ' . $password . '<br>'; $user_try = new User(); $user_try->setUsername($username); $user_try->setPassword($password); if($user_try->login()) { echo '<br>Cookie datas corrects<br>'; $_SESSION['id_adherent'] = serialize($user_try); //header('Location: index.php'); exit(); } else { // A mettre dans le fichier log $error = 'La combinaison Login/Mot de passe est incorrect'; } } else { // A mettre dans le fichier log $error = 'Le Cookie est invalide'; } }
Regarde ce que ça affiche.
Bonjour
Effectivement il contiens bien "_" alors le return faut le faire ou ?
J'ai essayé mais toujours aucun résultat.
Merci pour ton aide précieuse.
Effectivement il contiens bien "_" alors le return faut le faire ou ?
J'ai essayé mais toujours aucun résultat.
Merci pour ton aide précieuse.
Et ben à l'intérieur de tes deux méthodes "crypt" et "decrypt", faut bien qu'elles retournent quelque chose.
Exemple !
Exemple !
<?php class Security { const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh'; public static function hash($donnee) { return sha1(md5($donnee) . self::GRAIN . sha1($donnee . self::GRAIN) . $donnee); } public static function clean($donnee) { return trim($donnee); } public static function crypt($donnee) { return encrypt($donnee, self::GRAIN); } public static function decrypt($donnee) { return decrypt($donnee, self::GRAIN); } }
Bonjour
J'ai vraiment la poisse avec le COOKIE............
Toujours obligé de me reconnecter, je te redonne mon fichier de reconnexion auto qui est dans index.php on sait jamais....
après il y a le reste mais sans importance
Merci
J'ai vraiment la poisse avec le COOKIE............
Toujours obligé de me reconnecter, je te redonne mon fichier de reconnexion auto qui est dans index.php on sait jamais....
<?php session_start();?> <?php require_once 'connexion/database.php'; require_once 'class/security.php'; require_once 'class/user.php'; require_once 'fonction/general.php'; ?> <?php if(isset($_COOKIE) && !isset($_SESSION)) { $values = Security::clean($_COOKIE['moncookie']); $values = explode('_', $values); if(count($values) == 2) { $username = Security::decrypt($values[0]); $password = Security::decrypt($values[1]); $user_try = new User(); $user_try->setUsername($username); $user_try->setPassword($password); if($user_try->login()) { $_SESSION['id_adherent'] = serialize($user_try); header('Location: index.php?body=compte_profil&type=compte'); exit(); } else { // A mettre dans le fichier log $error = 'La combinaison Login/Mot de passe est incorrect'; } } else { // A mettre dans le fichier log $error = 'Le Cookie est invalide'; } } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
après il y a le reste mais sans importance
Merci
erreur maintenant
Fatal error: Call to undefined function decrypt() in C....
??
Fatal error: Call to undefined function decrypt() in C....
??
<?php class Security { const GRAIN = 'f?,j89-k0.;-!?lqjçs_di3%5a6_4jhfgh'; public static function hash($donnee) { return sha1(md5($donnee) . self::GRAIN . sha1($donnee . self::GRAIN) . $donnee); } public static function clean($donnee) { return trim($donnee); } public static function crypt($donnee) { $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $encrypted_string = mcrypt_encrypt( MCRYPT_BLOWFISH, self::GRAIN, utf8_encode($donnee), MCRYPT_MODE_ECB, $iv); return $encrypted_string; } public static function decrypt($donnee) { $iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $decrypted_string = mcrypt_decrypt( MCRYPT_BLOWFISH, self::GRAIN, $donnee, MCRYPT_MODE_ECB, $iv); return $decrypted_string; } }
Bonjour,
Super génial ça fonctionne à merveille comment j'aurais pu m'en sortir seul, ça aurai été du domaine de l'impossible.
Je me permet encore de te demander pour crypter le COOKIE, à propos de ton commentaire ci-dessous.
J'ai créé un champ hash_cookie.
Merci
Super génial ça fonctionne à merveille comment j'aurais pu m'en sortir seul, ça aurai été du domaine de l'impossible.
Je me permet encore de te demander pour crypter le COOKIE, à propos de ton commentaire ci-dessous.
J'ai créé un champ hash_cookie.
Il faut penser à remplacer le mot de passe de l'utilisateur que tu insères dans le cookie par autre chose ! Je l'ai mis juste a titre d'exemple, mais même si celui-ci est crypté, il faut éviter d'héberger du contenu privé coté client. Donc tu peux ajouter un deuxième mot de passe dans la table utilisateur. Ce deuxième mot de passe contient un hash aléatoire. Et à chaque fois que l'utilisateur se connecte VIA le cookie, alors tu mets à jour ce deuxième mot de passe
Merci
On dirais qu'on a dépassé les 50 messages, ça en fait un peu trop pour un seul sujet :) !
Ajoutes cette méthode à la classe Security.
Dans login.
Dans la connexion automatique.
Dans la classe User.
Ajoutes cette méthode à la classe Security.
public static function getRandomHash() { return self::hash(rand() . sha1(self::GRAIN) . microtime(true)); }
Dans login.
if(!empty($_POST)) { $username = Security::clean($_POST['login']); $password = Security::clean($_POST['password']); if(empty($username) || empty($password)) { $error = 'Veuillez entrer le Login et le Mot de passe'; } else { $password = Security::hash($password); $user = new User(); $user->setUsername($username); $user->setPassword($password); if($user->login()) { if(isset($_POST['remember'])) { $hash = Security::getRandomHash(); $time = time() + 3600 * 24 * 3; $user->setHash($hash); $user->update(); $values[] = Security::crypt($user->getUsername()); $values[] = $hash; $values[] = Security::crypt($time); setcookie('moncookie', serialize($values), $time); } $_SESSION['id_adherent'] = serialize($user); header('Location: index.php?body=compte_profil&type=compte'); exit(); } else { $error = 'La combinaison Login/Mot de passe est incorrect'; } } }
Dans la connexion automatique.
if(!isset($_SESSION['id_adherent']) && isset($_COOKIE['moncookie'])) { $values = Security::clean($_COOKIE['moncookie']); $values = unserialize($values); if(count($values) == 3) { $username = Security::decrypt($values[0]); $hash = $values[1]; $time = Security::decrypt($values[2]); $user_try = User::get($username); if($user_try != null && $user_try->checkHash($hash)) { $values[1] = Security::getRandomHash(); $user_try->setHash($values[1]); $user_try->update(); $_SESSION['id_adherent'] = serialize($user_try); setcookie('moncookie', serialize($values), (int) $time); header('Location: index.php?body=compte_profil&type=compte'); exit(); } else { // A mettre dans le fichier log $error = 'Le Login est incorrect'; } } else { // A mettre dans le fichier log $error = 'Le Cookie est invalide'; } }
Dans la classe User.
private $hash; public function setHash($h) { $this->hash = $h; } public function setUserDatas(array $d) { if(!empty($d)) { $this->id = $d['id']; $this->username = $d['username']; $this->email = $d['email']; $this->password = $d['password']; $this->hash = $d['hash_cookie']; } } public function checkHash($hash) { return $this->hash == $hash; } public static function get($username) { $req = $this->db->prepare('SELECT id FROM tb_adherent WHERE username = :u'); $req->bindParam(':u', $username, PDO::PARAM_STR); $req->execute(); $r = $req->fetchColumn(); return ($r == false) ? null : new self($r); } public function update() { $req = $this->db->prepare('UPDATE tb_adherent SET username = :u, email = :e, password = :p, hash_cookie = :hc WHERE id = :id'); $req->bindParam(':u', $this->username, PDO::PARAM_STR); $req->bindParam(':e', $this->email, PDO::PARAM_STR); $req->bindParam(':p', $this->password, PDO::PARAM_STR); $req->bindParam(':hc', $this->hash, PDO::PARAM_STR); $req->bindParam(':id', $this->id, PDO::PARAM_INT); $req->execute(); }
Bonjour
Oui c'est vrai que pour une question ça fait un sujet énorme, mais tu m'a initié au class avec methode et POO.
C'est tellement bien que je veux bien comprendre et avec toi j'ai déjà bien avancé.
Mais c'est vrai que je n'avais jamais créé de COOKIE et pour moi c'est tout nouveau et aussi très complexe, sans toi je n'aurai jamais pu y arriver.
Merci beaucoup.
Désolé une petite erreur pour finaliser tout ça après je serai comblé.
Notice: Undefined property: User::$db in.........
Oui c'est vrai que pour une question ça fait un sujet énorme, mais tu m'a initié au class avec methode et POO.
C'est tellement bien que je veux bien comprendre et avec toi j'ai déjà bien avancé.
Mais c'est vrai que je n'avais jamais créé de COOKIE et pour moi c'est tout nouveau et aussi très complexe, sans toi je n'aurai jamais pu y arriver.
Merci beaucoup.
Désolé une petite erreur pour finaliser tout ça après je serai comblé.
Notice: Undefined property: User::$db in.........
J'ai pris une ancienne version de user.php, je corrige !
public static function get($username) { self::init(); $req = self::$db->prepare('SELECT id_adherent FROM tb_adherent WHERE login = :u'); $req->bindParam(':u', $username, PDO::PARAM_STR); $req->execute(); $id = $req->fetchColumn(); return ($id) ? new self((int) $id) : null; } public function update() { $req = self::$db->prepare('UPDATE tb_adherent SET login = :u, email = :e, password = :p, hach_cookie = :h WHERE id = :id'); $req->bindParam(':u', $this->username, PDO::PARAM_STR); $req->bindParam(':e', $this->email, PDO::PARAM_STR); $req->bindParam(':p', $this->password, PDO::PARAM_STR); $req->bindParam(':h', $this->hash, PDO::PARAM_STR); $req->bindParam(':id', $this->id, PDO::PARAM_INT); $req->execute(); }
Bonjour
je ne reste pas connecté malgrés le COOKIE avant le hash du OOKIE c'étais impec. alors ça ne doit pas bien être grave mais j'ai essayé de voir si je voyais un problème mais rien, alors encore une fois je m'en remet à toi.
aucune erreur de retournée.
Merci beaucoup.
je ne reste pas connecté malgrés le COOKIE avant le hash du OOKIE c'étais impec. alors ça ne doit pas bien être grave mais j'ai essayé de voir si je voyais un problème mais rien, alors encore une fois je m'en remet à toi.
aucune erreur de retournée.
Merci beaucoup.
Bonjour
J'ai trouvé une erreur lorsque la combinaison login/password ne correspondent pas
Catchable fatal error: Argument 1 passed to User::setUserDatas() must be an array, boolean given, called in......
je crois que c'est tout lié avec cette fonction enfin je ne suis pas sur...
J'ai trouvé une erreur lorsque la combinaison login/password ne correspondent pas
Catchable fatal error: Argument 1 passed to User::setUserDatas() must be an array, boolean given, called in......
je crois que c'est tout lié avec cette fonction enfin je ne suis pas sur...
public function setUserDatas(array $d) { if(!empty($d)) { $this->id = $d['id']; $this->username = $d['username']; $this->email = $d['email']; $this->password = $d['password']; $this->hash = $d['hash_cookie']; } }
Bonjour
Malheureusement c'est encore moi en fait je n'ai plus l'erreur, mais je reste pas connecté automatiquement.
Merci
Malheureusement c'est encore moi en fait je n'ai plus l'erreur, mais je reste pas connecté automatiquement.
Merci
Pourquoi ça, quelle est l'erreur ?