PHP problème de code - PHP - Programmation
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
Du coup ca devrai donner un truc du genre $nombre = $sql->rowcount();
Marsh Posté le 19-02-2014 à 15:47:23
Avant d'aller plus loin, vire-moi cette horreur :
blaboliper a écrit : |
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)
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...
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.
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é!
Marsh Posté le 20-02-2014 à 09:21:45
Petite exemple pour illustrer
Code :
|
Code :
|
Code :
|
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 :
|
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
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é! |
Si j'ai permis d'éviter que du code troué se retrouve un jour sur internet, je n'ai pas perdu mon temps.
Marsh Posté le 20-02-2014 à 15:07:30
kokola a écrit : Petite exemple pour illustrer
|
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 :
|
Voici un petit aperçu du site en cours de création:
Marsh Posté le 20-02-2014 à 15:28:36
N'hésite pas !
Pense à mettre [RESOLU] dans le titre de ton topic
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 :
|
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:
|
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 :
|
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 :
|
Edit: J'ai publié un post trop vite, je viens de trouvé l'erreur... Faute de frappe!
Marsh Posté le 20-02-2014 à 16:29:05
Là, je te laisse relire ton code, le message est assez clair
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 édité par blaboliper le 19-02-2014 à 13:48:39