2009-07-26 8 views

risposta

23

Se l'applicazione sta calcolando md5 solo quando qualcuno si registra sul tuo sito, o sta effettuando l'accesso, molte chiamate a md5 verranno effettuate all'ora? Un paio di centinaia? Se è così, non credo che la differenza molto piccola tra tra PHP e MySQL sarà significativa a tutti.

La domanda dovrebbe essere più simile a "dove metto il fatto che la password viene memorizzata utilizzando md5" rispetto a "ciò che mi fa vincere quasi nulla".

E, come nota a margine, un'altra domanda potrebbe essere: dove puoi permetterti di spendere risorse per quel tipo di calcoli? Se si dispone di 10 server PHP e un server di DB già sotto carico pesante, si ottiene la risposta ;-)

Ma, solo per divertimento:

mysql> select benchmark(1000000, md5('test')); 
+---------------------------------+ 
| benchmark(1000000, md5('test')) | 
+---------------------------------+ 
|        0 | 
+---------------------------------+ 
1 row in set (2.24 sec) 

E in PHP:

$before = microtime(true); 
for ($i=0 ; $i<1000000 ; $i++) { 
    $a = md5('test'); 
} 
$after = microtime(true); 
echo ($after-$before) . "\n"; 

dà:

$ php ~/developpement/tests/temp/temp.php 
3.3341760635376 

Ma probabilmente non calcolerete un milione di md5 come questo, vero?

(E questo non ha nulla a che fare con la prevenzione iniezioni SQL: basta fuggire/quote dei dati sempre o utilizzare le istruzioni preparate!!)

+6

Quando tutto il resto fallisce, conduci un esperimento. – Rafe

+2

quindi risparmierai circa un microsecondo facendolo nel database invece di farlo in PHP. sembra piuttosto trascurabile, ma interessante sapere comunque – Kip

+1

+1 per una risposta molto approfondita e un punto importante sulle iniezioni SQL :) – Draemon

4

Non so quale sia più veloce, ma se lo fai in PHP eviti la possibilità di SQL injection.

+1

In ogni caso, creo mysql_real_escape_string sui miei parametri $ pwd. –

+1

Questo non ha nulla a che fare con questo. Una dichiarazione preparata risolverebbe questo senza spostare la funzione MD5, inoltre si sta facendo affidamento sulla funzione PHP MD5 per "sfuggire" alla password. – Draemon

+1

@Draemon: non ho detto che non c'erano altri modi per aggirarlo, ma l'esempio non fornisce alcuna indicazione di sfuggire al parametro. @hiam: se decidi di farlo in php, non dovresti sfuggire prima alla stringa della password. la funzione md5 di php può prendere qualsiasi stringa, ed è garantito che restituisca^[0-9a-f] {32} $ – Kip

0

Misuralo, è l'unico modo per essere certi.

3

Le prestazioni sono davvero un problema qui? È probabile che sia marginale.

  • Farlo in MySQL rende il DB fare di più lavoro, che è una buona cosa
  • Farlo in MySQL significa che la password in chiaro viene passato più avanti (e la connessione DB è spesso in chiaro).
  • Questo non ha nulla a che fare con l'iniezione SQL. È possibile correggere la prima versione senza spostare la funzione MD5. Inoltre, se c'è un bug nella funzione MD5 di PHP c'è ancora la possibilità di un attacco di iniezione.
+2

Che bug nella funzione md5? Ti aspetti di sfruttarlo in qualche modo e invece di 32 cifre esadecimali puoi generare alcuni caratteri speciali e un'istruzione SQL ben formata? Non succederà. – lacop

+1

Questo è esattamente il tipo di atteggiamento che porta agli exploit. Non dovresti usare funzioni arbitrarie e spero che sanitizzino i tuoi dati. Cosa succederebbe se qualcuno rimuovesse il requisito MD5 a un certo punto: realizzerà che i dati non sono sicuri? – Draemon

+1

Questo è semplicemente sciocco, non ci si può quindi fidare nemmeno di alcuna funzione di escape o di portarla a qualsiasi funzione estrema. Anche php stesso o mysql possono essere bacati. Quindi, l'unico modo per evitare gli exploit è non scrivere alcun codice. – lacop

0

direi, leggere il valore della colonna di mysql, quindi confrontare il risultato con l'hash calcolato nel codice cliente (es. php).

Il motivo principale per fare questo è che evita cavolate come la banca dati fascicolazione della colonna in modo non binario (ad esempio ecc case-insensitive), che è generalmente indesiderabile per un hash.