Penso di perdere le mie biglie qui ... Ho un problema sul mio sito web dove casualmente smette di accettare gli accessi. Ora sono riuscito a rintracciarlo in crypt() comportandosi in modo molto strano.PHP crypt() risposta errata
Nel mio database, ho la versione criptata della password dell'utente - quindi diciamo Og12345678.
Quando l'utente effettua il login, inserisce la sua password, ho letto il sale del db e poi criptato ciò che è entrato e confrontato - di solito questo funziona molto bene.
Quindi sto facendo crypt ($ insertedPassword, $ saltFromDb) - in questo caso, il sale sarebbe Og ovviamente. Normalmente per un dato utente la cripta della password funziona bene.
Quando le cose vanno male (e quando lo fanno è un cambiamento permanente fino al riavvio di Apache) ho scoperto che crypt inizia a restituire una risposta DIVERSA per lo stesso input con lo stesso sale.
E 'coerente tuttavia, vale a dire una volta che il sistema è andato storto cripta restituisce la risposta sbagliata, ma è sempre il ritorno la risposta sbagliata stesso. Gli aggiornamenti ripetuti della pagina mostrano lo stesso risultato. Lo stesso sale è anche evidente nel risultato della cripta appena errata, quindi non è che il sale sia scomparso da qualche parte.
Se riavvio Apache e rieseguo lo script senza alcuna modifica, i risultati della cripta vengono quindi riportati al modo in cui dovrebbero essere.
Apprezzo che non sia l'ultimo PHP (5.2.8), ma darei valore a qualsiasi vista su questo incluso se si tratta di un bug noto risolto in una versione successiva (l'aggiornamento di PHP non è un compito felice con molti siti alcuni dei quali ancora usa sfortunate stranezze che devono essere nuovamente testate con ogni aggiornamento) - se è un bug noto, allora ovviamente otterrò tutto aggiornato al più presto, al di là del fatto che probabilmente sarò più semplice esternalizzare la cripta esternamente dato che ho solo usalo in un posto comune per il mio sito.
Qualsiasi input apprezzato.
Matt Peddlesden
--- aggiornamento il 11 marzo 2011
Correzione di commentare in precedenza dato sul sistema operativo ... - sistema operativo è Windows Server 2008 SP1 a 64 bit. Mi scuso avrei dovuto ricontrollare piuttosto che presumere che potessi ricordare! Machine è un processore Dell 2950 8gb Ram, Xeon.
Sto iniziando a pensare secondo le linee suggerite da Krtek - quando il sistema è impazzito, se creo un nuovo crypt() (cioè un esempio molto semplice in cui imposto una variabile in una stringa, la crittografa e poi la confronta con la cripta) - tutto funziona alla grande. Quando riavvio il server, di nuovo tutto torna ai calcoli precedenti. Quindi sono decisamente propenso a qualcosa che è cambiando l'algoritmo utilizzato per calcolare il risultato di crypt() ... qualsiasi idea su cosa potrebbe causare questo accada? Ho stampato i valori di CRYPT_STD_DES ecc. E non cambiano tra riavvii.
Qualcuno ha qualche indizio su cosa potrebbe causare questo?
Qualunque cosa fosse sembrata accadere due volte in un giorno ieri, la cosa più strana.
Grazie per le risposte finora.
--- aggiornamento: 16 Mar 2011
Volevo solo per fornire un altro aggiornamento.
Questo sta ancora accadendo, ancora senza ulteriori spiegazioni sul perché.
Nel caso in cui qualcuno si imbatta in questo in futuro, penso che la mia soluzione sta andando a fare un brutto scherzo per spingere tutte le esecuzioni di crypt() su un'applicazione C# esterna e smettere di fare affidamento su PHP per farli. Qualcosa sta andando male da qualche parte e, a questo punto, l'unica soluzione che riesco a vedere è rimuoverlo completamente dall'equazione.
Ovviamente se si verifica ancora, sarà interessante saperlo! :)
Grazie a tutti.
penso che sia improbabile che questo è il tuo problema, ma vedo che il consiglio nella documentazione di PHP - http://php.net/manual/en/function.crypt.php - è che devi passare la password criptata intera (salata) come sale. 'if (crypt ($ insertedPassword, $ cryptedPasswordFromDB) == $ cryptedPasswordFromDB) {...}'. Il punto sembra essere che quindi crypt() può determinare quale algoritmo di hashing è in uso da $ cryptedPasswordFromDB. Ancora una volta, dubito che questa sia la causa del tuo problema, ma potresti dargli una risposta ... –
È possibile che uno script modifichi alcune configurazioni di php risultanti in una diversa funzione di hash usata da crypt? Come detto da @Gareth passando la password completa dal db puoi risolvere questo problema. – krtek
Sto iniziando a pensare secondo le linee suggerite da Krtek - quando il sistema è impazzito, se creo un nuovo crypt() (cioè un esempio molto semplice in cui imposto una variabile in una stringa, la criptico e la confronti con la cripta) - tutto funziona alla grande. Quando riavvio il server, tutto torna a funzionare di nuovo. Quindi sono decisamente propenso a qualcosa che sta cambiando l'algoritmo usato per calcolare il risultato di crypt() ... qualsiasi idea su cosa potrebbe causare che ciò accada? Ho stampato i valori di CRYPT_STD_DES ecc. E non cambiano tra riavvii. –