une erreur que j'avais jamais vu

une erreur que j'avais jamais vu - PHP - Programmation

Marsh Posté le 17-03-2007 à 17:20:59    

bonjour,
 
pour le nouveau site que je suis en train de créer, j'ai mis un système de membres.
mais quand j'essaye de me conncter, je remplis le formulaire de connexion, je valide et j'ai une erreur bizzare :  

Citation :

Erreur de syntaxe près de 'azerty' à la ligne 1.

(azerty est mon passe pour mes tests)
 
je viens de passer 2 heures a chercher d'où cela pouvait provenir et je voit pas du tout
 
je mettrai mes fichiers demain (et si il y a besoin)

Reply

Marsh Posté le 17-03-2007 à 17:20:59   

Reply

Marsh Posté le 17-03-2007 à 18:20:27    

il manque un ; a la ligne 38.
 
Plus sérieusement, sans le code, on pourra pas te dire.

Reply

Marsh Posté le 17-03-2007 à 18:54:06    

le code est sur un autre ordi, je l'uploaderai demain
 
mais a la ligne 1 y'a juste

Citation :

<?php


j'ai sauté une ligne avant de commencer a ecrire le reste
 
edit :

Code :
  1. <?php
  2. if( isset($_POST['pseudo']) AND isset($_POST['pass']) ) //si les champs sont remplis
  3. {
  4.  mysql_connect("localhost","root","" ) or die(mysql_error());
  5.  mysql_select_db("test" ) or die(mysql_error());
  6.  $reponse = mysql_query('SELECT * FROM membres WHERE pseudo=\'' .$_POST['pseudo']. ' AND pass=\'' .$_POST['pass']. '') or die(mysql_error()); //on cherche si le membre existe
  7.  while( $donnees = $reponse ) //si les données entrées sont correctes
  8.  {
  9.  $datedefin = time()+365*24*3600;
  10.  setcookie('Pseudo', $donnees['pseudo'] , $datedefin);
  11.  setcookie('Pass', $donnees['pass'] , $datedefin);
  12.  ?><p>Vous êtes à présent connectés<p><?php //on crée les cookies et on informe l'usager
  13.  }
  14. }
  15. else
  16. {?><p>Veuillez remplir tous les champs</p>
  17. <?php }
  18. mysql_close(); //on oublie surtout pas de fermer mysql ?>
  19. <p><a href="index.php">Revenir à la page d'accueil</a></p> <!--dans tous les cas on met un lien vers l'accueil -->

Message cité 1 fois
Message édité par thomas0302 le 18-03-2007 à 17:23:38
Reply

Marsh Posté le 19-03-2007 à 11:38:28    

euuuuuuuu
y a des truc etranges dans ton code.
Déja il est complet? parceque dans se cas tu le ferme ou le premier <?php??
Ensuite pourquoi tu ferme une balise php pour afficher du texte un simple echo "<p>montexte</p>"; suffit

Reply

Marsh Posté le 19-03-2007 à 12:07:15    

AND, ça existe ça, dans un test php :??: normalement, c'est && qu'il faut utiliser...
if ( (isset($_POST['pseudo'])) && (isset($_POST['pass'])) ) {
...
}

Reply

Marsh Posté le 19-03-2007 à 12:20:07    

Euh, l'erreur de syntaxe est évaluée avant l'éxécution du script donc je vois pas trop comment le azerty viendrait de $_POST.
 
A mon avis tu dois avoir la chaine azerty qui traine quelque part dans du code php...

Reply

Marsh Posté le 19-03-2007 à 12:26:49    

Code :
  1. mysql_close(); //on oublie surtout pas de fermer mysql ?>


 

Code :
  1. mysql_close(); //on oublie surtout pas de fermer mysql
  2. ?>

serait mieux à mon avis...

Reply

Marsh Posté le 19-03-2007 à 13:50:45    

RiderCrazy a écrit :

Code :
  1. mysql_close(); //on oublie surtout pas de fermer mysql ?>


 

Code :
  1. mysql_close(); //on oublie surtout pas de fermer mysql
  2. ?>

serait mieux à mon avis...


 
Pas d'accord. On est pas obligé de fermé la balise PHP à la fin du fichier.
Au contraire, ca évite les erreurs de type 'cannot send header... already send...'
Genre qu'on on oublis des sauts de ligne à la fin du fichier

Reply

Marsh Posté le 19-03-2007 à 13:55:51    

nORKy a écrit :

Pas d'accord. On est pas obligé de fermé la balise PHP à la fin du fichier.
Au contraire, ca évite les erreurs de type 'cannot send header... already send...'
Genre qu'on on oublis des sauts de ligne à la fin du fichier


 [:grinking]  du grand art ...

Reply

Marsh Posté le 19-03-2007 à 14:23:33    

nORKy a écrit :

Pas d'accord. On est pas obligé de fermé la balise PHP à la fin du fichier.
Au contraire, ca évite les erreurs de type 'cannot send header... already send...'
Genre qu'on on oublis des sauts de ligne à la fin du fichier


Ok lol

Reply

Marsh Posté le 19-03-2007 à 14:23:33   

Reply

Marsh Posté le 19-03-2007 à 14:29:30    

thomas0302 a écrit :

Code :
  1. $reponse = mysql_query('SELECT * FROM membres WHERE pseudo=\'' .$_POST['pseudo']. ' AND pass=\'' .$_POST['pass']. '') or die(mysql_error()); //on cherche si le membre existe



Genre c'est dure de préciser que c'est une erreur mysql [:moule_bite] ?
Une apostrophe est manquante à la fin de la requête, et tu le verrais de suite si tu affichais, en plus de l'erreur sql, la requête elle-même, dans le die().


---------------
HAHAHA I M USING TEH INTERNET
Reply

Marsh Posté le 19-03-2007 à 14:33:42    

Master p a écrit :

Genre c'est dure de préciser que c'est une erreur mysql [:moule_bite] ?
Une apostrophe est manquante à la fin de la requête, et tu le verrais de suite si tu affichais, en plus de l'erreur sql, la requête elle-même, dans le die().


 
Presque ca, je dirais même qu'il  manque également, au vu de la façon dont c'est écrit, un inhibiteur.

Code :
  1. $reponse = mysql_query('SELECT * FROM membres WHERE pseudo=\'' .$_POST['pseudo']. ' AND pass=\'' .$_POST['pass']. '\'') or die(mysql_error());

Message cité 1 fois
Message édité par nORKy le 19-03-2007 à 14:33:59
Reply

Marsh Posté le 19-03-2007 à 14:56:46    

thomas0302 : quant tu auras corrigé l'erreur de syntaxe, prend le temps de te renseigner sur les "injections sql"

Reply

Marsh Posté le 19-03-2007 à 20:37:01    

rufo a écrit :

AND, ça existe ça, dans un test php :??: normalement, c'est && qu'il faut utiliser...
if ( (isset($_POST['pseudo'])) && (isset($_POST['pass'])) ) {
...
}


 
bah j'ai deja vu des AND (chez des pros (enfin normalement ^^)) alors je fais pareil :spamafote:
 

anapajari a écrit :

Euh, l'erreur de syntaxe est évaluée avant l'éxécution du script donc je vois pas trop comment le azerty viendrait de $_POST.
 
A mon avis tu dois avoir la chaine azerty qui traine quelque part dans du code php...


 
bah non pourtant
 

RiderCrazy a écrit :

Code :
  1. mysql_close(); //on oublie surtout pas de fermer mysql ?>


 

Code :
  1. mysql_close(); //on oublie surtout pas de fermer mysql
  2. ?>

serait mieux à mon avis...


 
en fait j'ai ajouté le commentaire après, pas fais gaffe
 

Master p a écrit :

Genre c'est dure de préciser que c'est une erreur mysql [:moule_bite] ?  
Une apostrophe est manquante à la fin de la requête, et tu le verrais de suite si tu affichais, en plus de l'erreur sql, la requête elle-même, dans le die().


 
et comment je sais que c'est une erreur sql alors qu'il me dit erreur a la ligne 1 et qu'a la ligne 1 y'a pas de sql

Message cité 1 fois
Message édité par thomas0302 le 19-03-2007 à 20:37:13
Reply

Marsh Posté le 19-03-2007 à 20:47:54    

thomas0302 a écrit :

et comment je sais que c'est une erreur sql alors qu'il me dit erreur a la ligne 1 et qu'a la ligne 1 y'a pas de sql


Réfléchis un peu à ce que tu fais. Tu arrêtes le script si la requête SQL provoque une erreur. Au lieu d'indiquer juste le contenu de l'erreur mysql, tu fais une jolie concaténation genre 'Erreur SQL : '.$sql.'<br />'.mysql_error()
Ça t'inspirera peut-être un peu plus...


---------------
HAHAHA I M USING TEH INTERNET
Reply

Marsh Posté le 20-03-2007 à 16:22:28    

soju a écrit :

thomas0302 : quant tu auras corrigé l'erreur de syntaxe, prend le temps de te renseigner sur les "injections sql"


+1

Reply

Marsh Posté le 20-03-2007 à 16:35:48    

malgré tous vos conseils, j'ai toujours la meme erreur
 

Code :
  1. <?php
  2. if( isset($_POST['pseudo']) && isset($_POST['pass']) ) //si les champs sont remplis
  3. {
  4.  mysql_connect("localhost","root","" );
  5.  mysql_select_db("test" );
  6.  $reponse = mysql_query('SELECT * FROM membres WHERE pseudo=\'' . $_POST['pseudo'] . ' AND pass=\'' . $_POST['pass'] . '\'') or die(mysql_error()); //on cherche si le membre existe
  7.  if( $donnees = $reponse ) //si les données entrées sont correctes
  8.  {
  9.  $datedefin = time()+365*24*3600;
  10.  setcookie('pseudo', $donnees['pseudo'] , $datedefin);
  11.  setcookie('pass', $donnees['pass'] , $datedefin);
  12.  echo '<p>Vous êtes à présent connectés<p>'; //on crée les cookies et on informe l'usager
  13.  }
  14. }
  15. else
  16. {
  17. echo '<p>Veuillez remplir tous les champs</p>';
  18.  }
  19. mysql_close(); //on oublie surtout pas de fermer mysql  
  20. ?>
  21. <p><a href="index.php">Revenir à la page d'accueil</a></p> <!--dans tous les cas on met un lien vers l'accueil -->

Reply

Marsh Posté le 20-03-2007 à 16:49:30    

Parce que t'as toujours pas rajouté l'apostrophe manquante... :sleep:  
 
Et +1 pour les injections SQL (mysqli's your friend).


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 20-03-2007 à 16:51:47    

nORKy a écrit :

Presque ca, je dirais même qu'il  manque également, au vu de la façon dont c'est écrit, un inhibiteur.

Code :
  1. $reponse = mysql_query('SELECT * FROM membres WHERE pseudo=\'' .$_POST['pseudo']. ' AND pass=\'' .$_POST['pass']. '\'') or die(mysql_error());



 
j'ai recopié ce qu'on m'a dit ici ;)

Reply

Marsh Posté le 20-03-2007 à 16:53:21    

Il en manque une autre, ouvre un peu les yeux ou affiche la requête avec un echo, je sais pas... :x


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 20-03-2007 à 16:54:16    

Voilà ce que donne ta requête :

Code :
  1. SELECT * FROM membres WHERE pseudo='mon pseudo AND pass='motdepasse'


 
 
Elle est où l'erreur à ton avis? ;)
 
En passant comme ca t'as déjà été signalé plus haut sous le terme d' "injection sql" je peux modifier ta requette comme je veux en mettant des mots de passe ou des peudos bidons. En fait, je peux même me conecter sans conaitre le moindre mot de passe et donc me faire passer pour n'importe qui (y compris l'admin)
Exemple :
pseudo saisie = "admin"
mot de passe saisie = " ' or 1=1 or 'pass=' "  
ce qui donnera comme requette (quand t'auras corrigé ton erreur) :
 

Code :
  1. SELECT * FROM membres WHERE pseudo='admin' AND pass=' ' or 1=1 or 'pass=' '


Et voilà, je suis connecté et pourtant je ne conais pas le mot de passe.
 
PS : Dans l'exemple présent, c'est de l'injection sql assez gentille et pourtant potentiellement trés dangeureuse vu que ca permet à n'importe qui de modifier ce qu'il veut dans les limites du systémes d'administration du site. Cependant si la personne s'amuse à faire des requettes imbriqués, (mettre des requettes dans une requette) elle peut bloquer ton serveur sql en saturant le processeur et elle pourrait également modifier les données stockés dans la base.
 
PS2 : En php5 et php6 (le 4 il me semble aussi mais je ne suis pas sur) on peut mettre indifferament "&&" et "AND" ainsi que "||" et "OR". Par contre, "&&" et "||" ont un niveau de priorité différent de "AND" et "OR" ce qui fait que ca peut entrainer des résultats différents dans certains cas.

Reply

Marsh Posté le 20-03-2007 à 16:55:37    

thomas0302 a écrit :

j'ai recopié ce qu'on m'a dit ici ;)


C'est pour ça que je ne t'ai pas donné pas la réponse directement. On t'a dit le problème, tu le résouds, ou sinon tu reviendras une heure après nous dire que t'as une nouvelle erreur.


---------------
HAHAHA I M USING TEH INTERNET
Reply

Marsh Posté le 20-03-2007 à 16:56:03    

thomas0302 a écrit :

Code :
  1. if( $donnees = $reponse ) //si les données entrées sont correctes



Ton test est foireux là... enfin, ça veut rien dire. $donnees n'est pas initialisé et reponse c'est juste la référence de ta requête.

 

Sinon, faudrait revoir ta requête, l'erreur vient de là [:spamafote]

 
Code :
  1. 'SELECT * FROM membres WHERE pseudo=\'' . $_POST['pseudo'] . '\' AND pass=\'' . $_POST['pass'] . '\''

juste en corrigeant, pas d'amélioration

 

edit: Overburned... poster en bossant, caimal. et gros +1 pour les injections :o


Message édité par RiderCrazy le 20-03-2007 à 16:57:24
Reply

Marsh Posté le 20-03-2007 à 16:57:50    

omega2 a écrit :

PS2 : En php5 et php6 (le 4 il me semble aussi mais je ne suis pas sur) on peut mettre indifferament "&&" et "AND" ainsi que "||" et "OR". Par contre, "&&" et "||" ont un niveau de priorité différent de "AND" et "OR" ce qui fait que ca peut entrainer des résultats différents dans certains cas.


Ce langage est une vaste blague [:dawak]


---------------
HAHAHA I M USING TEH INTERNET
Reply

Marsh Posté le 20-03-2007 à 16:59:25    

C'est pareil en Ruby, donc ça peut pas être un défaut de PHP. :o


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 20-03-2007 à 17:00:07    

omega2 a écrit :

Voilà ce que donne ta requête :

Code :
  1. SELECT * FROM membres WHERE pseudo='mon pseudo AND pass='motdepasse'


 
 
Elle est où l'erreur à ton avis? ;) en effet, c'est pas beau :ack:
 
En passant comme ca t'as déjà été signalé plus haut sous le terme d' "injection sql" je peux modifier ta requette comme je veux en mettant des mots de passe ou des peudos bidons. En fait, je peux même me conecter sans conaitre le moindre mot de passe et donc me faire passer pour n'importe qui (y compris l'admin)
Exemple :
pseudo saisie = "admin"
mot de passe saisie = " ' or 1=1 or 'pass=' "  
ce qui donnera comme requette (quand t'auras corrigé ton erreur) :
 

Code :
  1. SELECT * FROM membres WHERE pseudo='admin' AND pass=' ' or 1=1 or 'pass=' '


Et voilà, je suis connecté et pourtant je ne conais pas le mot de passe. comment faire pour l'empecher alors ?
 
PS : Dans l'exemple présent, c'est de l'injection sql assez gentille et pourtant potentiellement trés dangeureuse vu que ca permet à n'importe qui de modifier ce qu'il veut dans les limites du systémes d'administration du site. Cependant si la personne s'amuse à faire des requettes imbriqués, (mettre des requettes dans une requette) elle peut bloquer ton serveur sql en saturant le processeur et elle pourrait également modifier les données stockés dans la base.
 
PS2 : En php5 et php6 (le 4 il me semble aussi mais je ne suis pas sur) on peut mettre indifferament "&&" et "AND" ainsi que "||" et "OR". Par contre, "&&" et "||" ont un niveau de priorité différent de "AND" et "OR" ce qui fait que ca peut entrainer des résultats différents dans certains cas.


 

Reply

Marsh Posté le 20-03-2007 à 17:05:44    

sielfried a écrit :

C'est pareil en Ruby, donc ça peut pas être un défaut de PHP. :o


En y repensant, c'est vrai que c'est une fonctionnalité très intéressante [:petrus75]


---------------
HAHAHA I M USING TEH INTERNET
Reply

Marsh Posté le 20-03-2007 à 20:31:04    

Reply

Marsh Posté le 20-03-2007 à 20:55:04    

merci pour le lien (meme si je comprends rien, je relirai ça demain a tête reposée)
 


Message édité par thomas0302 le 22-03-2007 à 16:25:32
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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