PHP problème de code

PHP problème de code - PHP - Programmation

Marsh Posté le 19-02-2014 à 13:38:40    

Bonjour bonjour,
 
Je suis tout nouveau dans le monde du codage... Je suis en spécialité Sin (Systeme informatique et numérique).
 
Nous avons un projet, nous devons créé une "porte sécurisé" pour notre bac. Pour faire cour, on veux, avec un téléphone portable,
déverrouillé une porte a l'aide d'un code que l'utilisateur devra entré sur son portable. Le code sera envoyé grâce au module Bluetooth
sur une carte Arduino. La carte Arduino va enregistré les informations de la personne qui est entré a travers la porte d’accès et les envoyés sur  
une base de donnés. On connaitrait donc l'heure, la date, le nom d'utilisateur etc de la personne qui viens d'entré. Un personne (administrateur) pourra allé
sur un site web pour ajouté des personnes ayant le droit d’accédées a la porte, les modifier, les supprimés ou tout simplement contrôlé les accès.
 
Dans mon cas je fais partit de la programmation du site web. C'est la premiere fois que je touche a sa, j'ai étudié les bases seul... Car mon professeur ce dit incompétent en matière de HTML PHP et pas que etc(Et oui... Il ne connait quasiment pas les bases du PHP, il ne savait pas qu'il fallait un serveur pour utilisé du php enfin bref..), on doit donc ce débrouillé seul.
 
J'ai déja réussi a codé beaucoup d'élément. J'ai une page d’accueil, une page ou on peux voir les historiques des accès a la portes etc...
J'arrive a récupéré les informations de ma base de donnés, a ajouté des champs pour ajouté des nouveaux utilisateurs, les modifier sans problèmes (enfin... j'ai galeré)
 
Mon problème est la: Sur ma page d’accueil, l'administrateur doit pouvoir entré son login et son mot de passe pour allé sur le site web. Et je n'arrive pas du tout a utilisé la fonctionmysql_num_rows... Sa me marque toujours une erreur.  
 
Voila mon formulaire:
 
<form method="post" action="traitement.php">
  <p><span class="administrateur"><input type="text" name="administrateur" id="Administrateur" placeholder="Nom Administrateur" style="border-width : 0px; background-color: transparent;" /></span></p>
  <p><span class="motdepasse"><input type="password" name="pass" id="pass" placeholder="Mot de passe" style="border-width : 0px; background-color: transparent;" /></span></p>  
  <input type="submit" value="Connection">
 </form>
 
Voila mon traitement PHP:
 
<?php
$administrateur = $_POST['administrateur'];
$motdepasse = $_POST['pass'];
 
try
{
 $bdd = new PDO('mysql:host=localhost;dbname=mda', 'root', '');
}  
catch(Exception $e)
{
 die('Erreur : '.$e->getMessage());
}
 
 $sql = $bdd->query("SELECT * FROM administrateur WHERE administrateur='$administrateur'" );
 $nombre = mysql_num_rows($sql);
 
    if ($nombre !=0) {
  echo "Vous êtes connectés";
     }
 else {
  echo "Erreur dans votre login ou mot de passe";
  }
?>
 
Je ne sais plus quoi faire... J'ai essayé beaucoup de chose, beaucoup d'alternative mais la... Je bloque. Je pensais que sa allais être ma partit la plus facile, et voila
que je me retrouve bloqué la.  
 
Voici l'erreur:
Warning: mysql_num_rows() expects parameter 1 to be resource, object given in
 
A l'aide! Merci beaucoup! :)

Message cité 1 fois
Message édité par blaboliper le 19-02-2014 à 13:48:39
Reply

Marsh Posté le 19-02-2014 à 13:38:40   

Reply

Marsh Posté le 19-02-2014 à 15:26:06    

Bonjour,

 

Je te reponds rapidos depuis le bus.
Regarde ici http://fr.php.net/manual/fr/pdostatement.rowcount.php

 

En effet tu changes de techno (pdo puis retour a mysql_num_row)

 

Du coup, uniformise :p

 

Du coup ca devrai donner un truc du genre $nombre = $sql->rowcount();


Message édité par torwood3 le 19-02-2014 à 15:27:32

---------------
"La valeur d'un homme tient dans sa capacité à donner et non dans sa capacité à recevoir." Albert Einstein / "Dans la nature, tout a toujours une raison. Si tu comprends cette raison, tu n'as plus besoin de l'expérience." Léonard De Vinci
Reply

Marsh Posté le 19-02-2014 à 15:47:23    

Avant d'aller plus loin, vire-moi cette horreur :
 

blaboliper a écrit :


 $sql = $bdd->query("SELECT * FROM administrateur WHERE administrateur='$administrateur'" );


 
Si tu ne vois pas ce qui pose problème, fais une recherche sur "sql injection" (en gros, tu as une énorme faille de sécurité là). Et pour résoudre ça, recherche sur "requête préparée" (ou "prepared statement" si tu préfères l'anglais)


---------------
Are you two fucking? Are you serious? Right in front of my salad?!
Reply

Marsh Posté le 19-02-2014 à 16:40:15    

C'est parfait sa marche niquel! Voila mon code:
<?php
$administrateur = $_POST['administrateur'];
$motdepasse = $_POST['pass'];
 
try
{
 $bdd = new PDO('mysql:host=localhost;dbname=mda', 'root', '');
}  
catch(Exception $e)
{
 die('Erreur : '.$e->getMessage());
}
  $sql = $bdd->query("SELECT * FROM administrateur WHERE administrateur='$administrateur' AND motdepasse='$motdepasse'" );
 $nombre = $sql->rowcount();
 
    if ($nombre !=0) {
  echo 'Vous êtes connectés, cliquez <a href="menu.php" target="_blank">ici</a>';
     }
 else {
  echo "Erreur dans votre login ou mot de passe";
  }
?>  
 
Mais bon... Comme dit Riokmij, j'aurais apparemment une faille au niveau sécurité, j'ai fait quelque recherche sur le "sql injection" et c'est pas très cool a voir.... Pourriez-vous m'expliqué en Bref qu'est-ce qu'une requete préparé? Je suis un peu perdue...
J'ai trouvé un petit tuto sur openclassroom... Je pense pouvoir reussir a en faire une mais je ne vois pas ce qui vas ce passé. Je ne serais m'expliqué d'avantage...

Reply

Marsh Posté le 19-02-2014 à 17:58:02    

En très bref : le problème, c'est que tu construis une requête SQL en assemblant des bouts de texte, dont certains proviennent directement de l'utilisateur. Du coup, un utilisateur malicieux pourra tordre ta requête pour qu'elle ne retourne pas ce que tu en attends. Si $administrateur ou $motdepasse contiennent des apostrophes, on va pouvoir mettre à côté le SQL que l'on veut, et par exemple complètement contourner la vérification de mot de passe (dans certains cas, c'est encore pire, on peut corrompre certaines requêtes pour extraire le contenu complet de n'importe quelle table, voire modifier ou détruire des données).
 
Les requêtes préparées sont une bonne solution à ce problème : au lieu de construire ta requête en mettant bout à bout des morceaux de texte, tu vas écrire une requête qui va prendre des paramètres, et ensuite leur passer les valeurs que tu veux. Ça évite les injections, car en procédant ainsi, la requête est écrite à l'avance, il n'y a plus moyen de changer son sens en bricolant avec des apostrophes ou autres caractères spéciaux, le driver de la base de données s'assure de cela.
 
Bref, si tu dois retenir une seule chose : utilise systématiquement les requêtes préparées, ou au strict minimum à chaque fois qu'une requête implique des données qui peuvent provenir de l'utilisateur.


---------------
Are you two fucking? Are you serious? Right in front of my salad?!
Reply

Marsh Posté le 20-02-2014 à 09:18:30    

Ah oui, la c'est bien plus clair! Je vais essayé de faire sa de suite, je vous donnerais des nouvelles! Merci beaucoup pour l'aide apporté!

Reply

Marsh Posté le 20-02-2014 à 09:21:45    

Petite exemple pour illustrer :)
 

Code :
  1. // Requete avant :  
  2. "SELECT * FROM administrateur WHERE administrateur='$administrateur' AND motdepasse='$motdepasse'"


Code :
  1. // Requete Normal:
  2. "SELECT * FROM administrateur WHERE administrateur='Admin' AND motdepasse='MDP'"
  3. $administrateur = Admin
  4. $motdepasse = MDP


Code :
  1. // Sql Injection:  
  2. "SELECT * FROM administrateur WHERE administrateur='Admin' AND motdepasse=' LOL' OR 1=1 --' "
  3. $administrateur = Admin
  4. $motdepasse =  LOL' OR 1=1 --


La deuxième requete cherchera dans ta base un login ayant pour nom Admin et un mot de passe égal à LOL ou alors 1=1. Comme 1=1 est toujours vrai, tu sera connecté.
 
 
En requête préparé, tu aurais ceci :

Code :
  1. $query = "SELECT * FROM administrateur WHERE administrateur=:username AND motdepasse=:password"; // :username et :password indique que PDO doit relier des paramètres ici
  2. $query = $db->prepare($query );
  3. $query->bindValue(':username', $administrateur , PDO::PARAM_STR); // On indique à PDO que le paramètre :username correspond à la variable $administrateur
  4. $query->bindValue(':password', $motdepasse , PDO::PARAM_STR); // On indique à PDO que le paramètre :password correspond à la variable $motdepasse  
  5. $query->execute(); // On exécute la reqûete
  6. $res    = $query->fetchAll(PDO::FETCH_OBJ); // On récupère les lignes sous forme d'un objet
  7. if(isset($res[0])){ // Si il existe une ligne 0 (la première), c'est que l'on est logué
  8. // Login - Password Valide
  9. echo "Bonjour : ".$res[0]->administrateur;
  10. } else{
  11. // Login - Password Incorrecte
  12. echo "Login Password incorrecte !!!";
  13. }


 
On doit pouvoir améliorer mon petit bout de code, mais il devrait fonctionner et convenir pour ton système.
 
EDIT : Petites corrections du matin :D

Message cité 1 fois
Message édité par kokola le 20-02-2014 à 10:04:08
Reply

Marsh Posté le 20-02-2014 à 09:39:29    

blaboliper a écrit :

Ah oui, la c'est bien plus clair! Je vais essayé de faire sa de suite, je vous donnerais des nouvelles! Merci beaucoup pour l'aide apporté!


 
 [:ab614] Si j'ai permis d'éviter que du code troué se retrouve un jour sur internet, je n'ai pas perdu mon temps.


---------------
Are you two fucking? Are you serious? Right in front of my salad?!
Reply

Marsh Posté le 20-02-2014 à 15:07:30    

kokola a écrit :

Petite exemple pour illustrer :)
 
En requête préparé, tu aurais ceci :

Code :
  1. $query = "SELECT * FROM administrateur WHERE administrateur=:username AND motdepasse=:password"; // :username et :password indique que PDO doit relier des paramètres ici
  2. $query = $db->prepare($query );
  3. $query->bindValue(':username', $administrateur , PDO::PARAM_STR); // On indique à PDO que le paramètre :username correspond à la variable $administrateur
  4. $query->bindValue(':password', $motdepasse , PDO::PARAM_STR); // On indique à PDO que le paramètre :password correspond à la variable $motdepasse  
  5. $query->execute(); // On exécute la reqûete
  6. $res    = $query->fetchAll(PDO::FETCH_OBJ); // On récupère les lignes sous forme d'un objet
  7. if(isset($res[0])){ // Si il existe une ligne 0 (la première), c'est que l'on est logué
  8. // Login - Password Valide
  9. echo "Bonjour : ".$res[0]->administrateur;
  10. } else{
  11. // Login - Password Incorrecte
  12. echo "Login Password incorrecte !!!";
  13. }


 
On doit pouvoir améliorer mon petit bout de code, mais il devrait fonctionner et convenir pour ton système.
 
EDIT : Petites corrections du matin :D


 
C'est parfait! Sa marche parfaitement, j'ai du faire d'éventuellement modification, mais rien de bien méchant! Merci beaucoup pour l'explication!!
 
Riokmik: Non, sa ma été très utile!!
Je vous donne des nouvelles sur l'avancé sur site web, si je bloque je vous fais signe! Encore merci!!
 
Voila mon code:
 

Code :
  1. $query = "SELECT * FROM administrateur WHERE administrateur=:username AND motdepasse=:password"; // :username et :password indique que PDO doit relier des paramètres ici
  2.     $query = $bdd->prepare($query );
  3.     $query->bindValue(':username', $administrateur , PDO::PARAM_STR); // On indique à PDO que le paramètre :username correspond à la variable $administrateur
  4.     $query->bindValue(':password', $motdepasse , PDO::PARAM_STR); // On indique à PDO que le paramètre :password correspond à la variable $motdepasse   
  5.     $query->execute(); // On exécute la reqûete
  6.     $res = $query->fetchAll(PDO::FETCH_OBJ); // On récupère les lignes sous forme d'un objet
  7.     if(isset($res[0])){ // Si il existe une ligne 0 (la première), c'est que l'on est logué
  8.     // Login - Password Valide
  9.  echo '<img src="CSS/image/connexionR.jpg" class="connexionR" alt="connexionR"/>';
  10.  echo '<META HTTP-EQUIV="Refresh" CONTENT="2; URL=menu-Page2.php">';
  11.  echo '<span class="texte1"> Vous êtes connectés, la page va se rafraichir ou cliquez <a href="menu-Page2.php" target="_blank">ici</a></span>';
  12.     } else{
  13. // Login - Password Incorrecte
  14.  echo '<img src="CSS/image/connexionR.jpg" class="connexionR" alt="connexionR"/>';
  15.  echo '<span class="texte2">Erreur dans votre login ou mot de passe</span>';
  16.  echo '<META HTTP-EQUIV="Refresh" CONTENT="2; URL=Connection-Page1.php">';
  17.     }


 
Voici un petit aperçu du site en cours de création:
 
https://imagizer.imageshack.us/v2/806x390q90/835/v1zp.jpg
https://imagizer.imageshack.us/v2/806x382q90/713/rcpe.jpg


Message édité par blaboliper le 20-02-2014 à 15:08:34
Reply

Marsh Posté le 20-02-2014 à 15:28:36    

N'hésite pas !
 
Pense à mettre [RESOLU] dans le titre de ton topic :)
 

Reply

Marsh Posté le 20-02-2014 à 15:28:36   

Reply

Marsh Posté le 20-02-2014 à 16:02:09    

Ah non, j'ai peut-être un autre petit problème, j'aimerais vous demandé votre avis, j'ai fais une requete préparé du coup pour évité le SQL injection dans l'ajout d'utilisateur dans ma base de donnée. Voila ce que j'ai fais:  

Code :
  1. <?php
  2. $Nom = $_POST['Nom'];
  3. $Prenom = $_POST['Prénom'];
  4. $Utilisateur = $_POST['Utilisateur'];
  5. $Code = $_POST['Code'];
  6. $Classe = $_POSR['Classe']
  7. try
  8. {
  9. $bdd = new PDO('mysql:host=localhost;dbname=mda', 'root', ''); //connexion sur la base de donnée
  10. }
  11. catch(Exception $e)
  12. {
  13. die('Erreur : '.$e->getMessage());
  14. }
  15. $req = $bdd->prepare('INSERT INTO utilisateur(Nom, Prenom, Utilisateur, Code, Classe) VALUES(:Nom, :Prenom, :Utilisateur, :Code), :Classe'); //insertion dans la base de donnée
  16. $req->execute(array(
  17.     //variable des champs pour ajouté un utilisateur
  18. 'Nom' => $Nom,
  19. 'Prenom' => $Prenom,
  20. 'Utilisateur' => $Utilisateur,
  21. 'Code' => $Code,
  22. 'Classe'=> $Classe,
  23. ));
  24. echo "$Nom $Prenom à bien été enregistré sous le nom d'utilisateur $Utilisateur et le code $Code";
  25. ?>

Reply

Marsh Posté le 20-02-2014 à 16:14:32    

blaboliper a écrit :

Ah non, j'ai peut-être un autre petit problème, j'aimerais vous demandé votre avis, j'ai fais une requete préparé du coup pour évité le SQL injection dans l'ajout d'utilisateur dans ma base de donnée. Voila ce que j'ai fais:  

Code :
  1. <?php
  2. $Nom = $_POST['Nom'];
  3. $Prenom = $_POST['Prénom'];
  4. $Utilisateur = $_POST['Utilisateur'];
  5. $Code = $_POST['Code'];
  6. $Classe = $_POSR['Classe'];
  7. try
  8. {
  9. $bdd = new PDO('mysql:host=localhost;dbname=mda', 'root', ''); //connexion sur la base de donnée
  10. }
  11. catch(Exception $e)
  12. {
  13. die('Erreur : '.$e->getMessage());
  14. }
  15. $req = $bdd->prepare('INSERT INTO utilisateur(Nom, Prenom, Utilisateur, Code, Classe) VALUES(:Nom, :Prenom, :Utilisateur, :Code, :Classe)'); //insertion dans la base de donnée
  16. $req->execute(array(
  17.     //variable des champs pour ajouté un utilisateur
  18. 'Nom' => $Nom,
  19. 'Prenom' => $Prenom,
  20. 'Utilisateur' => $Utilisateur,
  21. 'Code' => $Code,
  22. 'Classe'=> $Classe,
  23. ));
  24. echo "$Nom $Prenom à bien été enregistré sous le nom d'utilisateur $Utilisateur et le code $Code et fait partit de la classe $Classe";
  25. ?>



Message édité par blaboliper le 20-02-2014 à 16:15:05
Reply

Marsh Posté le 20-02-2014 à 16:19:12    

Tu as oublié les : dans les noms de variables, et tu as une virgule en trop

Code :
  1. // Remplace
  2. $req->execute(array('Nom' => $Nom,'Prenom' => $Prenom,'Utilisateur' => $Utilisateur,'Code' => $Code,'Classe'=> $Classe,));
  3. // Par
  4. $req->execute(array(':Nom' => $Nom,':Prenom' => $Prenom,':Utilisateur' => $Utilisateur,':Code' => $Code,':Classe'=> $Classe));


 
 

Reply

Marsh Posté le 20-02-2014 à 16:27:05    

C'est remplacé... Mais maintenant il me dit que j'ai une erreur a la ligne 6, je ne comprend pas pourquoi :l Voici l'erreur: Notice: Undefined variable: _POSR
 

Code :
  1. <?php
  2. $Nom = $_POST['Nom'];
  3. $Prenom = $_POST['Prénom'];
  4. $Utilisateur = $_POST['Utilisateur'];
  5. $Code = $_POST['Code'];
  6. $Classe = $_POST['Classe'];
  7. try
  8. {
  9. $bdd = new PDO('mysql:host=localhost;dbname=mda', 'root', ''); //connexion sur la base de donnée
  10. }
  11. catch(Exception $e)
  12. {
  13. die('Erreur : '.$e->getMessage());
  14. }
  15. $req = $bdd->prepare('INSERT INTO utilisateur(Nom, Prenom, Utilisateur, Code, Classe) VALUES(:Nom, :Prenom, :Utilisateur, :Code, :Classe)'); //insertion dans la base de donnée
  16. $req->execute(array(':Nom' => $Nom,':Prenom' => $Prenom,':Utilisateur' => $Utilisateur,':Code' => $Code,':Classe'=> $Classe));
  17. echo "$Nom $Prenom à bien été enregistré sous le nom d'utilisateur $Utilisateur et le code $Code et fait partit de la classe $Classe";
  18. ?>


 
Edit: J'ai publié un post trop vite, je viens de trouvé l'erreur... Faute de frappe!


Message édité par blaboliper le 20-02-2014 à 16:30:01
Reply

Marsh Posté le 20-02-2014 à 16:29:05    

Là, je te laisse relire ton code, le message est assez clair ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed