2011-09-16 12 views
5

Sto imparando MySQL e PHP attraverso un libro in biblioteca. Stavo migliorando la sicurezza del sistema di crittografia della password modificando la memorizzazione delle password daPossibile ritardo quando si utilizza NOW() in MySQL Query?

password=SHA('password') 

a

password=SHA(CONCAT('password', '--', registration_date)) 

dove registration_date è il timestamp quando l'utente registrato.

Il codice attuale di registrazione degli utenti è:

INSERT INTO users (first_name, last_name, email, password, registration_date) 
VALUES ('first_name', 'last_name', 'email', SHA(CONCAT('password', '--', NOW())), NOW()); 

Avrò bisogno di preoccuparsi per le due diverse ora funzioni() in là? C'è la possibilità che abbiano tempi leggermente diversi? Ho provato con un paio di domande e sembrava funzionare bene.

Se c'è un problema, come posso risolvere il problema?

+0

È meglio essere molto, molto, molto, molto, molto, molto sicuri che il campo registration_date non possa mai, mai, mai e poi mai essere aggiornato. Altrimenti ti troverai con una mancanza improvvisa di utenti. –

+0

@Larry - che si applica anche al campo della password. :) –

risposta

3

Nessun problema. Da manual:

NOW() restituisce un tempo costante che indica l'ora in cui la dichiarazione ha iniziato a essere eseguita. (All'interno di una funzione memorizzata o un trigger, NOW() restituisce l'ora in cui la dichiarazione di funzione o innescando ha cominciato ad eseguire.)

Come mostra il manuale per esempio, ogni valutazione di NOW() all'interno di un'istruzione restituisce lo stesso valore , indipendentemente da quanto tempo è trascorso tra le valutazioni.

0

Su un server, non devi preoccuparti. Dalla documentazione:

NOW() restituisce una costante di tempo che indica il momento in cui la dichiarazione ha cominciato a eseguire.

(http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_now) Quindi il valore non cambierà in una query.

Tuttavia, dovresti fare attenzione alla replica basata sull'istruzione. Se esiste la possibilità che il database venga replicato in questo modo (ad esempio per i backup o HA), lo slave potrebbe avere un diverso NOW() rispetto al master.

+0

Buon punto su SBR. Maestro e schiavo possono effettivamente avere valori 'NOW()' diversi. Ma i valori di 'NOW()' in una fila dello schiavo saranno gli stessi _in quella fila_. (Penso che questo potrebbe essere un errore dell'OP.) Se le differenze tra i valori di 'NOW()' master e slave sono un problema, la replica basata su riga risolve il problema. In alternativa, è possibile giocare con 'SET TIMESTAMP' (che influenza il valore di' NOW() ') per aggirare il problema. –

Problemi correlati