PDA

View Full Version : [php+mysql] confronto tra password criptata e non, help =(


matte91snake
12-10-2010, 22:38
Salve a tutti, devo fare un confronto tra due password, una criptata con la funzione password() di mysql e una presa in input.. (una sorta di login).

non riesco proprio a uscirne... al momento sono messo così:

if( md5($input) == $criptata") {

ma non mi entra mai nell'if...

può essere che sbaglio questa query??

$criptata = mysql_query("SELECT pass FROM account WHERE (id='$id') AND (code='$code')");

grazie in anticipo per eventuali risposte =)

bobbytre
13-10-2010, 00:19
non mi convince molto la query che hai scritto ,...

pero' puoi verificare rapidissimamente il risultato della query eseguendo print_r dopo mysql_query

$criptata = mysql_query("SELECT pass FROM account WHERE (id='$id') AND (code='$code')");
print_r($criptata);


e in base al risultato capire perchè il confronto nell' if non va secondo i tuoi piani

matte91snake
13-10-2010, 00:34
non mi convince molto la query che hai scritto ,...

pero' puoi verificare rapidissimamente il risultato della query eseguendo print_r dopo mysql_query

$criptata = mysql_query("SELECT pass FROM account WHERE (id='$id') AND (code='$code')");
print_r($criptata);


e in base al risultato capire perchè il confronto nell' if non va secondo i tuoi piani

esce scritto in più:

Resource id #4Resource id #5 :confused:

bobbytre
13-10-2010, 01:55
e se provi cosi ?


$criptata = mysql_query("SELECT pass FROM account WHERE (id='$id') AND (code='$code')");
var_dump($criptata);



comunque , credo che con qualcosa di simile potresti risolvere ...

$criptata = mysql_query("SELECT pass FROM account WHERE (id='$id') AND (code='$code')");
$i = mysql_fetch_assoc($criptata);

if( $i['pass'] == md5($input) )
{
// loggato !
}
else
{
// non loggato !
}

dojolab
13-10-2010, 07:13
esce scritto in più:

Resource id #4Resource id #5 :confused:

Il print_r va fatto sul resultset non sulla query.
Esegui un mysql_fetch_array(QUERY); e poi fai il print_r vedrai cosa ti ritorna.

matte91snake
13-10-2010, 12:08
la query per la password mi restituisce false , ma se eseguo la stessa query senza variabili ovvero con dati che immetto io corretti, funziona.

quindi sbaglio a prendere il valore di $code, che dovrebbe essere 1999, ma se esegui il print di code mi restituisce:

Array ( [0] => 1999 [code] => 1999 )

poi cerca id e lo trova, mentre code ovviamente non l otrova perchè cè questa stringa al posto del solo valore effettivo.

come faccio a fargli "prendere" solo 1999???

ndakota
13-10-2010, 12:33
$nome_array["code"]

?

matte91snake
13-10-2010, 12:45
$nome_array["code"]

?

grande, grazie. :)

ultima cosa e credo funzioni tutto :oink:

string(41) "*9F54B889A1F09476CE33C857A7EA8F2253330C72" string(32) "cc2b9ae3d0b93c90a0e269239934ebf4"

la stringa da 41 è la password nel database, la stringa da 32 è quella criptata con la funzione md5 di php.

ovviamente sono ancora bloccato,dato che l' if non può essere thrue.
mi pare che la funzione password di mysql cripta in md5, perchè escono 9 byte in meno se la cripto con php????? :stordita:

dojolab
13-10-2010, 13:22
grande, grazie. :)

ultima cosa e credo funzioni tutto :oink:

string(41) "*9F54B889A1F09476CE33C857A7EA8F2253330C72" string(32) "cc2b9ae3d0b93c90a0e269239934ebf4"

la stringa da 41 è la password nel database, la stringa da 32 è quella criptata con la funzione md5 di php.

ovviamente sono ancora bloccato,dato che l' if non può essere thrue.
mi pare che la funzione password di mysql cripta in md5, perchè escono 9 byte in meno se la cripto con php????? :stordita:

Mi sembra strano.

"Calculates an MD5 128-bit checksum for the string. The value is returned as a binary string of 32 hex digits, or NULL if the argument was NULL. The return value can, for example, be used as a hash key. See the notes at the beginning of this section about storing hash values efficiently."

Come quella di PHP. L'algoritmo è quello.

Infrid
13-10-2010, 13:24
magari le password non sono in md5 ma in sha1 :D

matte91snake
13-10-2010, 13:27
Mi sembra strano.

"Calculates an MD5 128-bit checksum for the string. The value is returned as a binary string of 32 hex digits, or NULL if the argument was NULL. The return value can, for example, be used as a hash key. See the notes at the beginning of this section about storing hash values efficiently."

Come quella di PHP. L'algoritmo è quello.

eppure con la funzione password() mi ritrovo nel database stringhe di 41 byte compreso l'asterisco in testa.. :mbe: :stordita: :mc: :confused:

non capisco come cripta e come fargli fare la stessa cosa in php :muro:

dojolab
13-10-2010, 13:29
eppure con la funzione password() mi ritrovo nel database stringhe di 41 byte compreso l'asterisco in testa.. :mbe: :stordita: :mc: :confused:

non capisco come cripta e come fargli fare la stessa cosa in php :muro:

Usa la funzione MD5... ;)
MD5("VALORE"), su MySQL...

La documentazione (http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html) aiuta :)

matte91snake
13-10-2010, 13:37
Usa la funzione MD5... ;)
MD5("VALORE"), su MySQL...

La documentazione (http://dev.mysql.com/doc/refman/5.0/en/encryption-functions.html) aiuta :)

purtroppo sono legato all'uso di password() :(

dojolab
13-10-2010, 13:51
purtroppo sono legato all'uso di password() :(

In che senso?

Comunque sia password non ritorna una codifica MD5... usa Password al posto dell md5, dove sta il problema? Ti basta fare una subquery ;)

matte91snake
13-10-2010, 13:55
In che senso?

Comunque sia password non ritorna una codifica MD5... usa Password al posto dell md5, dove sta il problema? Ti basta fare una subquery ;)

perdonami ma non so cosa sia una subquery :doh:
una cosa del genere può funzionare??
$var = mysql_query("passoword($var2)");

avevo gia provato ma non funzia. :stordita:

dojolab
13-10-2010, 14:04
perdonami ma non so cosa sia una subquery :doh:
una cosa del genere può funzionare??
$var = mysql_query("passoword($var2)");

avevo gia provato ma non funzia. :stordita:

No, direi di no.
Prova:

SELECT [....]*WHERE password = (SELECT PASSWORD('valore')).

Ora non ricordo se la sintassi è questa su MySQL.
Studiati le query annidate/subqueries.

tuccio`
13-10-2010, 15:06
credo si usi IN

dojolab
13-10-2010, 15:18
credo si usi IN

Si può essere, un ho un lapsus.
Colpa di Oracle? :D


EDIT: è indifferente, IN mi pare estragga più rows.
Ma non è il suo caso (Ps. posso ricordarmi male).



SELECT users.name
FROM users
WHERE users.password = (

SELECT PASSWORD('test')
)
LIMIT 0,1

matte91snake
13-10-2010, 19:00
ho risolto con un paio di query in piu che agiscono in una sola tabella, con una sola riga con solo 2 colonne.
una serve per il where e ha il valore 1, l'altra contiene la password che gli faccio salvare con la funzione e successivamente prelevo il risultato criptato e faccio il confronto con la password gia criptata in origine.
lo so, molto pacchiana e grossolana come alterativa,ma non sparatemi :sofico: