Requete sql qui marche 1fois/x sans modif

Résolu/Fermé
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 - Modifié par IvyAlice le 30/08/2011 à 14:53
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 - 30 août 2011 à 17:15
Bonjour à toutes et à tous,

Là je me heurte à une énigme que même scooby et les autres ne pourrait pas résoudre(hmm quoique Vera p-e).

voyez un peu :

mysql> SELECT User FROM user WHERE  ( (User='Chewbacca') AND ( encrypt( Password='123456' ) ) ); 
+-------------+ 
| User        | 
+-------------+ 
| Chewbacca | 
+-------------+ 
1 row in set (0.00 sec) 

mysql> SELECT User FROM user WHERE  ( (User='Chewbacca') AND ( encrypt( Password='123456' ) ) ); 
Empty set (0.00 sec)


deux fois la même requête (j'ai fait un copier/coller) et pas le même résultat alors que rien n'a été modifié sur la DB

ça me fait la même chose depuis la page php(forcément c'est pas magique).



J'y comprend rien, je ne vois absolument pas quel est l'élément qui a changé.
autre chose, après ces tests. j'arrive à sortir chaque fois une réponse si j'enlève la 2ème partie du AND, par contre la condition encrypt sans le user ne semble pas trouvé de résultat.

Quelle raison peut faire que ça fonctionne 1 coup et ensuite plus ?
Y a-t-il un problème connu avec la fonction encrypt?

Merci d'avance pour votre aide et vos conseils


Ivy



"ça ne marche pas" n'est pas une source d'information suffisante pour que quiconque vous aide à dépanner quoique ce soit.
A voir également:

6 réponses

Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
30 août 2011 à 15:27
hummm, pour la requête, ça serait pas plutôt ?
SELECT User FROM user WHERE  ( (User='Chewbacca') AND ( Password=encrypt('123456') ) ); 


Car toi tu passes Password='123456' a encrypt().
Je pense que ton problème vient de la.
0
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 32
30 août 2011 à 16:20
Salut ZEp3k!Gn0,

Merci pour ta réponse.

j'ai essayé ça (pour faire simple pour commencer):

SELECT User FROM user WHERE  Password=ENCRYPT('123456');


Mais là de nouveau il m'a retourné 0 entrée.

Ivy
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
Modifié par Zep3k!GnO le 30/08/2011 à 16:33
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
30 août 2011 à 16:26
Bonjour,

D'après la doc mysql :
ENCRYPT(str[,salt])

Encrypts str using the Unix crypt() system call and returns a binary string. The salt argument must be a string with at least two characters or the result will be NULL. If no salt argument is given, a random value is used.

mysql> SELECT ENCRYPT('hello');
        -> 'VxuFAJXVARROc'

ENCRYPT() ignores all but the first eight characters of str, at least on some systems. This behavior is determined by the implementation of the underlying crypt() system call.

The use of ENCRYPT() with the ucs2, utf16, or utf32 multi-byte character sets is not recommended because the system call expects a string terminated by a zero byte.

If crypt() is not available on your system (as is the case with Windows), ENCRYPT() always returns NULL. 


Comment dire... Ça n'a vraiment pas l'air d'être une bonne idée d'utiliser cette fonction, surtout sans mettre un deuxième argument salt...

Xavier
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 30/08/2011 à 16:32
En fait ce qui se passe, c'est que sans le salt, il prend un salt au hasard. J'imagine que ce « hasard » se fait en initialisant toujours à 0 la graine de la fonction de hasard.
En conséquence de quoi, à chaque fois que tu ouvres une nouvelle session MySQL, il va reprendre les mêmes salt dans le même ordre.

Pour illustrer, un petit exemple, avec en italique ce que rajoute implicitement MySQL :

-> Session MySQL 1 : insertion en base :
INSERT INTO ...... Password=encrypt('123456', 'salt_1')

-> Session MySQL 2 : test de connexion :
1 - SELECT User FROM user WHERE Password=ENCRYPT('123456', 'salt_1')
--- résultat OK !
2 - SELECT User FROM user WHERE Password=ENCRYPT('123456', 'salt_2')
--- résultat KO !
3 - SELECT User FROM user WHERE Password=ENCRYPT('123456', 'salt_3')
--- résultat KO !
...

-> Session MySQL 3 : nouveaux tests de connexion :
1 - SELECT User FROM user WHERE Password=ENCRYPT('123456', 'salt_1')
--- résultat OK !
2 - SELECT User FROM user WHERE Password=ENCRYPT('123456', 'salt_2')
--- résultat KO !
3 - SELECT User FROM user WHERE Password=ENCRYPT('123456', 'salt_3')
--- résultat KO !
...

et ainsi de suite...

Xavier
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 30/08/2011 à 16:42
Donc, solution :
Soit tu utilises cette fonction, si tu es sûr de ne pas avoir d'encodages complexes (UTF16 & co.), en spécifiant un salt bien défini, et toujours le même.
Du coup tes requêtes seraient un truc de ce genre :
INSERT INTO ...... Password=encrypt('123456', 'abcd')
SELECT User FROM user WHERE Password=ENCRYPT('123456', 'abcd')

Soit tu utilises une autre fonction, par exemple md5().
0
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 32
30 août 2011 à 16:33
Bonjour Xavier,

Merci pour ta réponse.

Ce n'est peut-être pas la fonction qui répond à mes besoins finalement :-/

En fait j'ai mis dans Password les mots de passe avec "IDENTIFIED BY" ce qui fait qu'ils sont crypté automatiquement par sql (ça donne une chaine de 41 caractères dont le premier est une étoile)

ensuite, pour dire si l'utilisateur peut se logger ou non je souhaite comparer le mot de passe qu'il y entré avec celui contenu dans la base, mais en le cryptant (sinon évidemment, 123456 ne sera pas égal à *aklsjdfsioualjsdfvhadkl7sdfhha8wsk5ldj44 )

j'ai pas encore trouvé de solution qui marche

Ivy
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
30 août 2011 à 16:43
OK, alors c'est la fonction PASSWORD() que tu veux.

https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html#function_password
PASSWORD(str)

Calculates and returns a password string from the plaintext password str and returns a string, or NULL if the argument was NULL. This is the function that is used for encrypting MySQL passwords for storage in the Password column of the user grant table.

As of MySQL 5.5.3, the return value is a nonbinary string in the connection character set. Before 5.5.3, the return value is a binary string.

mysql> SELECT PASSWORD('badpwd');
        -> '*AAB3E285149C0135D51A520E1940DD3263DC008C'

PASSWORD() encryption is one-way (not reversible). 
0
IvyAlice Messages postés 379 Date d'inscription lundi 17 septembre 2007 Statut Membre Dernière intervention 14 septembre 2013 32
30 août 2011 à 17:15
Ah oui !

PASSWORD marche!
Je suis désolée de t'avoir pris ton temps, je n'avais pas trouvé cette fonction (sûrement que j'avais pas entrer les bons mots-clefs)

En tout cas je l'ai essayé et ça marche ni-kel =)

Merci encore, et bonne soirée
0